2011-10-07 102 views
0

這裏是我搜索輸入:無法獲取正則表達式在PHP中工作,在工作程序的正則表達式

\u003cspan class=\"prs\">email_address@me.com\u003c\/span> 

試圖只返回[email protected]

我的正則表達式class=\\"prs\\">(.*?)\\在RegExp中返回"class=\"prs\">email_address@me.com\"這是好的,我可以使用該結果。

但我不能讓它在PHP中工作。

$regex = "/class=\\\"prs\\\">(.*?)\\/"; 

給我一個錯誤 「沒有結束符」

是否有人可以幫忙嗎?

回答

5

您的原始代碼:

$regex = "/class=\\\"prs\\\">(.*?)\\/"; 

No ending delimiter的原因是,雖然你前進的關閉之前逃離反斜槓斜線,你所做的是在PHP字符串的上下文中將其轉義,而不是在正則表達式引擎的上下文中。

所以PHP字符串轉義機制做了的事情,並通過正則表達式引擎得到它的時候,它看起來就像這樣:

/class=\"prs\">(.*?)\/ 

這意味着正則表達式引擎將看到在反斜槓表達式的結尾作爲轉義您正在用來關閉表達式的正斜槓。

這種事情通常的PHP解決方案是切換到使用單引號的字符串而不是雙引號的字符串,但這仍然行不通,因爲\\是單引號和雙引號中的轉義反斜線字符串。

你需要做的是翻倍的反斜槓字符在您的字符串結尾的號碼,這樣你的代碼需要看起來像這樣:

$regex = "/class=\\\"prs\\\">(.*?)\\\\/"; 

的方式來證明它在做什麼是打印$regex變量的內容,所以你可以看到字符串看起來像正則表達式引擎。這些類型的錯誤實際上很難發現,但查看字符串的實際內容將幫助您發現它們。

希望有所幫助。

+0

感謝您的幫助,這裏再也沒有錯誤,但是當我打印正則表達式時,它顯示爲/class=\"prs\">(.*?)\\/,應該是/ class = \ \「prs \\」>(。*?)\\ /我不知道如何使這項工作。 –

+0

然後在那裏需要相同的技巧:在另一個前面添加另一對反斜槓。因此,在每個引號字符之前,您的代碼中應該有五個連續的反斜槓。唷!如果將PHP字符串更改爲單引號,那麼可以將其縮減爲四次,以便引用字符本身不需要轉義。它變得非常毛茸茸,因爲您需要迎合PHP轉義和正則表達式轉義,同時掃描轉義字符串,所有字符串都使用反斜線進行轉義。 – Spudley

+0

謝謝,那是做的。我正要使用stripslashes()函數,但會刪除我需要結束搜索的斜槓。 –

0

如果更改爲單引號它應該修復它

$regex = '/class=\\\"prs\\\">(.*?)\\/'; 
+0

這沒有起作用,仍然得到「無結束分隔符」的錯誤。 –

+0

我認爲@Spudley可能有正確的答案,您需要添加額外的斜槓以及單引號。 – Mark

+0

感謝您的回覆 –