2014-01-30 47 views
0

有什麼辦法從href值提取部分? 例如我的代碼是:我不能從href值與preg_match_all

$searchfrom = '@<a class="uye" href="index.php?profil=12" contenteditable="false">@'; 
$search = '@<a class="uye" href="index.php?profil=(.*?)" contenteditable="false">@'; 
preg_match_all($search,$searchfrom,$sonuc); 

我想從searchfrom可變提取12。

回答

0

您犯了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()第二(可選)參數是分隔符。我已經寫了它,但默認情況下它是/

+0

非常感謝你這個偉大的答案。現在我理解了正則表達式的邏輯 –