您犯了3個錯誤,但是您的模式不起作用只有一個原因。
如何在模式中編寫文字字符串?
?
是一個特殊字符中一個正則表達式和裝置可選(之後的字符)或轉動一個量詞懶惰(後+
,*
,?
,{n,m}
)或是語法幾個特點的部分(非捕獲或原子組,條件,遞歸,定義)。
如果你想將它寫在一個模式爲文字,則必須退出:
php?profil => php\?profil
這是你的模式不工作的唯一原因。
與字面點相同。 .
有着特殊的意義,必須進行轉義:
index.php => index\.php
但由於.
意味着所有字符,它的字面點也很相配。
有十二必須在一個模式來逃脫被用作字面特殊字符:
[ () { ? * +^$ \ | .
注意,當左花括號{
後面沒有這樣的事情:2,5}
或,5}
或2,}
,情況並不明確(即開頭的大括號不是{n,m}
量詞的開頭),並且您不需要轉義它。
但是其他字符必須轉義:模式分隔符。
使用PHP,你必須使用一個模式定界符包圍的圖案,用得最多的是斜線/
,但你可以使用其它字符像~
#
@
... (請注意,使用正則表達式特殊字符或在圖案中多次使用,這是個不錯的主意。)
由於@
是原始字符串的一部分,您似乎已經忘記了放置分隔符。在該模式中,@
被視爲分隔符,因爲它是第一個字符,但它不被視爲文字@
。如果您想匹配@
,則必須將您的圖案與分隔符一起附上。
所以,正確的模式是:
$search = '/@<a class="uye" href="index\.php\?profil=(.*?)" contenteditable="false">@/';
如果你想避免搜索和逃避一個字符串在每個特殊字符,你可以附上\Q....\E
之間的文本字符串:
$search = '/\[email protected]<a class="uye" href="index.php?profil=\E(.*?)\Q" contenteditable="false">@\E/';
(模式分隔符(如果存在),必須始終轉義。)
或者您可以使用preg_quote()
功能:
$search = '/' . preg_quote('@<a class="uye" href="index.php?profil=', '/') . '(.*?)' . preg_quote('" contenteditable="false">@', '/') .'/';
的preg_quote()
第二(可選)參數是分隔符。我已經寫了它,但默認情況下它是/
。
非常感謝你這個偉大的答案。現在我理解了正則表達式的邏輯 –