2012-03-03 59 views
2

這是竊聽我:爲什麼PHP preg_ *函數需要正則表達式分隔符?

爲什麼preg_match('/pattern/', $haystack)而不是preg_match('pattern', $haystack)?我所見過的每件事都只是說明它們是必要的,並提到可以使用備用分隔符。

但是,它是一個函數,它定義了它自己的字符串外的接口。 它有一個標誌參數。添加內部字符串語法似乎反覆無常。

從pcre繼承的東西,作者是不是有興趣解決?又一個PHP的不正當事實?還是有理由?

+1

他們爲什麼要使分隔符可選?畢竟它們是** Perl兼容的正則表達式**。另外,PHP的PCRE函數中的'$ flags'參數不是放置修飾符的地方,不同於JavaScript的RegExp()構造函數中的flags參數。 – BoltClock 2012-03-03 23:50:53

+0

迷失在PHP開發的歷史中。也許中國哲學家F * * k知道。也許是因爲作者不希望你爲旗標修飾符使用單獨的arg。 – TerryE 2012-03-04 00:05:20

+0

@BoltClock:我的問題是*它們爲什麼存在?*分隔符是Perl語法的一部分,它們分隔正則表達式。 PHP正則表達式函數接受一個字符串,它在字符串的開始和結尾處出現了一個非常好的分隔符。我知道'$ flags'不用於標誌。這只是愚蠢的。 – quodlibetor 2012-03-04 00:07:25

回答

5

分隔符是爲了與Perl兼容。例如,Perl正則表達式使用分隔符,並依賴於結尾分隔符來表示開始of modifier flags,例如對於不區分大小寫的i

// Match alpha-numeric, case insensitive, multiline 
preg_match('/^[a-z0-9]+$/im', $input); 

可選的標誌參數preg_match()沒有實現正則表達式標誌一樣,按照第二限定i。他們服務於不同的功能,並且PREG_OFFSET_CAPTURE是唯一可用的標誌。這並不是說正則表達式標誌不能作爲另一個函數參數實現。他們當然可以擁有,但Perl兼容性是這裏的目標。

PHP不是直接借用Perl來實現正則表達式的唯一語言。 JavaScript在某種程度上,甚至Ruby甚至爲正則表達式匹配實現了Perl的=~運算符。

+1

這可能是事實,但「爲了與Perl兼容」並沒有什麼意義:分隔符是Perl的一個語法特徵,而不是PHP。標誌可以非常容易地放入已有的preg_ *函數的'flags'參數中。分隔符對語法的淺顯影響不會影響深層次之類的任何兼容性。 – quodlibetor 2012-03-04 00:02:47

+0

@quodlibetor PHP不是用分隔符實現PCRE的唯一語言。 Ruby也是如此,JavaScript也在某種程度上。他們能以不同的方式實施嗎當然可以。以不同的方式實施它們有意義嗎?不太確定... – 2012-03-04 00:05:39

+0

PHP是將分隔符*放入字符串*中的唯一語言。使用''''或'''''作爲分隔符。 Ruby和JS都將Perl的語法用於正則表達式:您不會在其中編寫'/ pattern /',您可以編寫'/ pattern /'。這是一種語言功能,而不是其他語言的功能。 – quodlibetor 2012-03-04 00:19:11

0

我相信這是爲互操作性完成的,因此您可以將&粘貼模式從/複製到另一種語言,而不必將模式選項轉換爲/從PHP標誌中。

0

定界符用於Perl兼容性(因此,Perl Compatible Regular Expressions或PCRE)。該模式還包括您選擇使用的任何修飾符,並且必須在之後放置結束分隔符。

-1

它是繼承的東西嗎?

事實是,每種編程語言都需要一個標準,所以PCRE是一個更好的標準。 click