Какой-то неясный синтаксис PHP - PullRequest
0 голосов
/ 09 апреля 2010

Я новичок в 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

Я получаю:

Ошибка разбора: синтаксическая ошибка, неожиданная T_SL в /home/vhosts/mysite.com/public_html/mypage.php по линии Х

Спасибо

Ответы [ 4 ]

6 голосов
/ 09 апреля 2010

Ошибка разбора: синтаксическая ошибка, неожиданная T_SL в /home/vhosts/mysite.com/public_html/mypage.php на линии X

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

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

$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" являются управляющими символами в регулярном выражении. Символы "/" обозначают начало и конец, а значение флага x (PCRE_EXTENDED) определено в: http://us.php.net/manual/en/reference.pcre.pattern.modifiers.php

5 голосов
/ 09 апреля 2010

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

$mytext = <<<TXT

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

TXT;

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

Подробнее читайте в руководстве

3 голосов
/ 09 апреля 2010

Это синтаксис heredoc .

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

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

2 голосов
/ 09 апреля 2010

В дополнение к тому, что другие пользователи говорили о том, что это синтаксис heredoc (обычно используется для больших строк, которые в противном случае потребовали бы большого количества экранирования), код определяет регулярное выражение, используя «/» в качестве разделителя.

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

Вы можете узнать больше о PHP regex engine здесь:

Использование регулярных выражений в PHP

...