0

我是 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'$regex 变成NULL

我收到:

解析错误:语法错误,第 X 行 /home/vhosts/mysite.com/public_html/mypage.php 中的意外 T_SL

谢谢

4

4 回答 4

6

解析错误:语法错误,第 X 行 /home/vhosts/mysite.com/public_html/mypage.php 中的意外 T_SL

这来自 END 附近。这称为 nowdoc,它是在 PHP 5.3 中添加的。由于您使用的是 PHP 5.2,并且此正则表达式使用 '\x',因此您需要一个带引号的字符串,或者您需要转义 '\'s。

正则表达式作为带引号的字符串的示例,用于此答案

$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

于 2010-04-08T23:19:58.533 回答
5

<<<并被END称为heredoc 语法- 一种将大量数据引用到变量的方法。

$mytext = <<<TXT

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

TXT;

这三个字符(此处为 TXT,在您的示例中为 END)可以是您喜欢的任何字符,尽管据我所知它们必须是字母数字。

在手册中阅读更多信息

于 2010-04-08T22:28:02.713 回答
3

这是heredoc 语法

<<< 'END'表示它是字符串的开头,并且直到“END”下一次出现之前的所有内容都将成为字符串的一部分(甚至是换行符)。

/and/x实际上是正则表达式的一部分。

于 2010-04-08T22:27:44.867 回答
2

除了其他用户所说的heredoc语法(通常用于需要大量转义的大字符串)之外,代码还定义了一个使用“/”作为分隔符的正则表达式。

最后的“/x”正在关闭正则表达式,然后告诉正则表达式引擎以“自由间距模式”执行它。其他可能的选项是 /i 表示不区分大小写或 /m 表示多行模式。

您可以在此处阅读有关 PHP 正则表达式引擎的更多信息:

在 PHP 中使用正则表达式

于 2010-04-08T22:31:30.303 回答