2010-04-08 5 views
0

Я начинающий PHP и увидел на форуме это PHP выражение:Некоторые неясными PHP синтаксис

Мой PHP версии 5.2.x()

$regex = <<<'END' 
/
    ([\x00-\x7F]     # single-byte sequences 0xxxxxxx 
    | [\xC0-\xDF][\x80-\xBF]  # double-byte sequences 110xxxxx 10xxxxxx 
    | [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2 
    | [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
) 
| ([\x80-\xBF])    # invalid byte in range 10000000 - 10111111 
| ([\xC0-\xFF])    # invalid byte in range 11000000 - 11111111 
/x 
END; 

Является ли этот код правильно? Что это за странные (для меня) конструкции, такие как <<<, 'END', /, /x и END; означает?

Моя версия PHP не поддерживает nowdoc, как заменить это выражение? без кавычек 'END' $ регулярное выражение стало NULL

Я получаю:

Parse error: syntax error, unexpected T_SL in /home/vhosts/mysite.com/public_html/mypage.php on line X

Благодаря

+2

Хотя это верно, PHP, безусловно, подавляющее большинство этого кода на самом деле является регулярным выражением и понимание регулярных выражений несколько не зависит от понимания PHP. Большинство современных языков сегодня имеют встроенный двигатель регулярных выражений, который принимает аналогичные выражения. –

ответ

6

Parse error: syntax error, unexpected T_SL in /home/vhosts/mysite.com/public_html/mypage.php on line X

Это происходит от «с около END. Это называется nowdoc, который был добавлен в PHP 5.3. Поскольку вы используете PHP 5.2, и это регулярное выражение использует «\ x», вам понадобится строка с кавычками, или вам нужно будет избежать «\».

Пример регулярного выражения как строки в кавычках, используемой в this answer:

$regex = '/ 
([\x00-\x7F]     # single-byte sequences 0xxxxxxx 
    | [\xC0-\xDF][\x80-\xBF]  # double-byte sequences 110xxxxx 10xxxxxx 
    | [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2 
    | [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
) 
| ([\x80-\xBF])    # invalid byte in range 10000000 - 10111111 
| ([\xC0-\xFF])    # invalid byte in range 11000000 - 11111111 
/x 
'; 

В «/» и «/ х» части являются управляющие символы в регулярном выражении.Знак «/» обозначает начало и конец, а значение флага x (PCRE_EXTENDED) определено в: http://us.php.net/manual/en/reference.pcre.pattern.modifiers.php

+4

+1 для распознавания разницы между nowdoc и heredoc! – notJim

3

Это heredoc syntax.

<<< 'END' говорит, что это начало строки, и все до следующего появления «END» будет частью строки (даже новой строки).

/ и /x на самом деле являются частью регулярного выражения.

5

<<< и END называются Heredoc синтаксис - способ цитировать большое количество данных переменной.

$mytext = <<<TXT 

this is my text and it 
can be many lines 
etc 
etc 

TXT; 

три символа (здесь TXT, END в вашем примере) может быть все, что вам нравится, хотя они должны быть буквенно-цифровым, насколько я знаю.

Подробнее на the manual

2

В дополнение к тому, что другие пользователи сказали про то, что Heredoc синтаксис (обычно используется для больших строк, которые в противном случае потребуется много побега), код, определяющий регулярное выражение с помощью "/"в качестве разделителя.

«/ x» в конце закрывает регулярное выражение, а затем сообщает движку регулярного выражения выполнить его в режиме «свободного пробела». Другими возможными параметрами были бы/i для нечувствительности к регистру или/m для многострочного режима.

Вы можете прочитать больше о регулярных выражений в PHP здесь:

Using Regular Expressions in PHP

+0

heredoc, newdoc ... Какая разница между ними .. '' END'' или просто 'END'? – serhio

+0

$ vars внутри heredocs расширяются, как если бы строка находилась в «двойных кавычках». $ in nowdocs обрабатывается как $ в одинарных кавычках. (Или наоборот, я недавно не смотрел 5.3). – jmucchiello

+0

Моя версия php не поддерживает nowdoc, как мне заменить это выражение? без кавычек '' $ regex стал NULL – serhio

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