2010-04-08 73 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'//xEND;的意思是什麼?

我的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有些獨立。今天常用的大多數語言都有一個內置的正則表達式引擎,它接受類似的表達式。 – 2010-04-08 22:33:08

回答

6

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

這個來自各地結束的。這被稱爲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

+4

+1,用於識別nowdoc和heredoc之間的區別! – notJim 2010-04-08 23:24:38

3

這是heredoc syntax

<<< 'END'表示它是一個字符串的開始,直到下一次出現「END」的所有內容都將成爲字符串的一部分(甚至是換行符)。

//x實際上是正則表達式的一部分。

5

<<<END稱爲定界符語法 - 引用了大量的數據給一個變量的一種方式。

$mytext = <<<TXT 

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

TXT; 

三個字符(這裏TXT,在你的例子END)可不管你喜歡,儘管它們必須是字母數字,據我所知。

更多的the manual

2

除了什麼其他用戶也說過它是定界符(通常用於大的字符串,否則將需要大量逸出),代碼定義使用正則表達式「 /「作爲分隔符。

最後的「/ x」正在關閉正則表達式,然後告訴正則表達式引擎以「自由間隔模式」執行它。對於不區分大小寫的情況,其他可能的選項是/ i,或者多行模式下的/ m。

你可以閱讀更多關於PHP的正則表達式引擎在這裏:

Using Regular Expressions in PHP

+0

heredoc,newdoc ...他們之間有什麼不同?''END''或者只是'END'? – serhio 2010-04-08 22:38:39

+0

heredocs中的$ vars被擴展,就好像字符串在「雙引號」中一樣。 nowdocs中的$在'單引號'中被視爲$。 (反之亦然,我最近沒有看5.3) – jmucchiello 2010-04-08 22:48:57

+0

我的PHP版本不支持nowdoc,我應該如何替換這個表達式?沒有引號「'$ regex變成NULL – serhio 2010-04-08 22:50:47