一些不清楚的PHP语法

时间:2010-04-08 22:24:04

标签: php syntax nowdoc

我是一名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'//xEND;是什么意思?

我的PHP版本不支持nowdoc,我该如何替换这个表达式?没有引号'END' $ regex成为NULL

我接受了:

  

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

由于

4 个答案:

答案 0 :(得分:6)

  

解析错误:语法错误,意外   T_SL in   /home/vhosts/mysite.com/public_html/mypage.php   在第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”部分是正则表达式中的控制字符。 “/”标记开头和结尾,x标志(PCRE_EXTENDED)的含义定义在:http://us.php.net/manual/en/reference.pcre.pattern.modifiers.php

答案 1 :(得分:5)

<<<END被称为 heredoc syntax - 一种向变量引用大量数据的方式。

$mytext = <<<TXT

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

TXT;

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

the manual

了解详情

答案 2 :(得分:3)

这是heredoc syntax

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

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

答案 3 :(得分:2)

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

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

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

Using Regular Expressions in PHP