2010-05-18 7 views
0

Quel serait l'équivalent PHP de cette regex Perl?Quel serait l'équivalent PHP de cette regex Perl?

if (/^([a-z0-9-]+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/ 
    and $1 ne "global" and $1 ne "") { 
    print " <tr>\n"; 
    print " <td>$1</td>\n"; 
    print " <td>$2</td>\n"; 
    print " <td>$3</td>\n"; 
    print " <td>$4</td>\n"; 
    print " <td>$5</td>\n"; 
    print " <td>$6</td>\n"; 
    print " <td>$7</td>\n"; 
    print " <td>$8</td>\n"; 
    print " </tr>\n"; 
} 
+2

Avez-vous lu la documentation ?: http://www.php.net/manual/en/book.pcre.php –

+0

Ouais, je n'étais pas sûr que l'on à utilisation. – Flukey

+0

Wow. Seul le premier champ vaut la peine d'être capturé, le reste ressemble à un grand * split * - * et un standard *. – Axeman

Répondre

2

PHP a quelques functions that work with PCRE. Donc, essayez ceci:

if (preg_match('/^([a-z0-9-]+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/', $str, $match) && $match[1] != "global" && $match[1] != "") { 
    print " <tr>\n"; 
    print " <td>$match[1]</td>\n"; 
    print " <td>$match[2]</td>\n"; 
    print " <td>$match[3]</td>\n"; 
    print " <td>$match[4]</td>\n"; 
    print " <td>$match[5]</td>\n"; 
    print " <td>$match[6]</td>\n"; 
    print " <td>$match[7]</td>\n"; 
    print " <td>$match[8]</td>\n"; 
    print " </tr>\n"; 
} 
+0

Excellent! Je vous remercie! :-) – Flukey

+0

Vous pouvez vérifier que '$ match [1]' est défini avant de tester d'autres conditions, pour éviter les avis/avertissements sur les lignes qui ne correspondent pas à l'entrée attendue. –

+1

@Greg K: '&&' est un opérateur de court-circuit en PHP. Cela signifie que dans 'A && B',' B' n'est évalué que si 'A' est * true *. Dans ce cas, $ match [1] 'n'est évalué que lorsque' preg_match' renvoie une valeur vraie. Et si 'preg_match' renvoie une valeur vraie,' $ match [1] 'est défini. Il n'est donc pas nécessaire de vérifier si '$ match [1]' existe. – Gumbo

6
+0

Excellent. Merci beaucoup! Cependant, dans preg_match, comment puis-je faire comme perl où vous avez 1 $, 2 $, 3 $, etc.? Espérons que cela a du sens! – Flukey

+3

Lire les documents auxquels il a lié: "Si des correspondances sont fournies, alors il est rempli avec les résultats de la recherche. $ Les correspondances [0] contiendront le texte correspondant au motif complet, $ Les correspondances [1] auront le texte correspondant le premier sous-motif parenthésé capturé, et ainsi de suite. " –

7

Je suggérerais plutôt que d'utiliser une regex, vous diviser sur les espaces. Tout ce que vous vérifiez est de huit colonnes séparées par des espaces.

Regardez preg_split à http://www.php.net/manual/en/function.preg-split.php. Il devrait ressembler à:

$fields = preg_split('/\s+/', $string); 
if ($fields[0] == '...') 
... 
+0

Bonne idée! Je vous remercie :-) – Flukey

Questions connexes