2010-05-18 2 views
0

Каким будет PHP-эквивалент этого регулярного выражения Perl?Каким будет PHP-эквивалент этого регулярного выражения 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

Читали ли вы какую-либо документацию ?: http://www.php.net/manual/en/book.pcre.php –

+0

Да, я просто не был уверен, какой из использовать. – Flukey

+0

Ничего себе. Только первое поле стоит захватить, остальное выглядит как большой * split * - * и стандартный в этом *. – Axeman

ответ

2

PHP имеет некоторые functions that work with PCRE. Так что попробуйте следующее:

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

Отлично! Спасибо! :-) – Flukey

+0

Возможно, вы захотите проверить, что '$ match [1]' устанавливается перед тестированием других условий, чтобы избежать уведомлений/предупреждений о строках, которые не соответствуют ожидаемому вводу. –

+1

@Greg K: '&&' является оператором короткого замыкания в PHP. Это означает, что в 'A && B',' B' оценивается только в том случае, если 'A' is * true *. В этом случае '$ match [1]' оценивается только тогда, когда 'preg_match' возвращает истинное значение. И если 'preg_match' возвращает истинное значение, устанавливается' $ match [1] '. Поэтому нет необходимости проверять, существует ли '$ match [1]'. – Gumbo

6
+0

Отлично. Огромное спасибо! Однако, в preg_match, как мне это сделать, как perl, где у вас есть $ 1, $ 2, $ 3 и т. Д.? Надеюсь, что имеет смысл! – Flukey

+3

Прочтите документы, к которым он привязался: «Если указаны совпадения, то они заполняются результатами поиска. $ Matches [0] будет содержать текст, который соответствует полному шаблону, $ matches [1] будет иметь текст, который соответствует первый захваченный подшаблон в скобках и т. д. ». –

7

Я бы предположил, что вместо использования регулярного выражения вы разделитесь на пробелы. Все, что вы проверяете, это восемь столбцов, разделенных пробелами.

Посмотрите на preg_split на http://www.php.net/manual/en/function.preg-split.php. Это должно выглядеть примерно так:

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

Хорошая идея! Спасибо :-) – Flukey

Смежные вопросы