2012-02-10 79 views
1

我有這樣的正則表達式的字符串,我從網站拉電子郵件從一個文件有:如何使用長正則表達式的字符串在PHP

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

伊夫在正則表達式好友(正則表達式測試軟件)測試,它的工作原理!

當我從正則表達式好友複製和粘貼正則表達式到我的PHP文件,我必須逃脫2 "字符,使正則表達式在PHP中形成一個有效的字符串。

在PHP我用這樣的:

$file = file_get_contents(/* URL TO GET */); 

$email_pattern = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"; 

$matches = array(); 

if (preg_match_all ($email_pattern, $file, $matches)) 
{ 
    echo print_r($matches, true); 
} 

,但我得到這樣的警告!?!?

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '@' 

但是,這個正則表達式在正則表達式中的作用?

我在哪裏出錯?

回答

4

兩件事:

第1步:

你需要把分隔符(在/前和正則表達式之後,這樣你就可以添加改性劑):

$email_pattern = "/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/"; 

第二步:

作爲一個PHP字符串,你需要轉義所有的特殊字符(比如\,必須變成\\,$就會變成\ $,等等......)

所以逃生包括在PHP字符串正則表達式應該是這樣的:

(?:[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*|\\\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\\\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\]) 

,你也有逃避/,因爲我們使用的卡拉科特第一步的分隔符。所以我們需要正則表達式來看\ /,但是當我們在一個php字符串中表達正則表達式時,我們將用\\/

替換/如果我是對的- 通常我使用正則表達式的朋友來做轉換與PHP導出工具,但現在我沒有,所以我已經通過hand--做了它應該給一些LIKE這樣的:

$email_pattern = '/(?:[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/'; 

我也建議你把字符串放在單引號內。

+0

我複製並粘貼您的回答並得到此錯誤:警告:preg_match_all()[function.preg-match-all]:未知修飾符'='。但等號已經逃脫了?我也用preg_quote來自動轉義正則表達式特殊字符,但他們我得到了錯誤:警告:preg_match_all()[function.preg-match-all]:未知修飾符'\' – 2012-02-10 14:56:18

+0

複製並粘貼我的anwser的第1步,但沒有你在步驟2中提到了你逃跑嗎? – FMaz008 2012-02-10 15:06:31

+0

虐待現在,\成爲\\和$成爲\ $,但我還有什麼應該知道的?網上有什麼清單嗎? – 2012-02-10 15:09:06

0

我試圖和......

單引號會給出錯誤...

使用雙引號和{}作爲分隔符//給出了一個錯誤也

+0

單引號將起作用,並且/分隔符不會給出錯誤,如果你在正則表達式中逃脫了thoses。現在甚至因爲雙引號而解釋了$。用單引號,幾乎只有\和'將需要逃脫。 – FMaz008 2012-02-10 14:58:03

+0

你的權利! PHP會很好,但不是電子郵件檢查的正則表達式 – 2012-02-10 14:59:38

+0

您必須爲php正則表達式,然後纔是正則表達式,所以在某些情況下您可能會有四個反斜槓,但雙引號只會使問題更難。 – FMaz008 2012-02-10 15:01:49

相關問題