2013-02-11 38 views
0

我有一個像正則表達式向後斷言 - 匹配鏈接錨文本

<a href="#" class="social google">Google</a> 
<a href="#" class="social yahoo">Yahoo</a> 
<a href="#" class="social facebook">Facebook</a> 

現在我使用正則表達式要match only anchor text鏈接。
我的意思是它應該只匹配第一個鏈接中的Google文本。

我試過這段代碼。

(?<=<a href="#" class="social .+?">).+?(?=</a>) 

但它沒有按預期工作。

任何人都可以給我正確的語法嗎?

+0

你想只有那些類的一個元素=」社會「? – 2013-02-11 15:10:40

+0

@RuiJarimba是 – Giri 2013-02-11 15:18:34

+0

@Giri:就像我在你之前的問題中說過的那樣。如果內容和類是任意的,則不可能僅匹配標籤內的文本。根本沒有支持。 – nhahtdh 2013-02-11 15:32:11

回答

1

內的比賽中展現出來,而不是使用的外觀(+?) -behind和前瞻排除你不想要的部分,我建議使用一個捕獲組只得到你想要的部分:

<a href="#" class="social .+?">(.+?)</a> 

概念,查找變通用於重疊的匹配。看起來你並不需要他們的功能。

(當然,usual caveats適用)

更新:這不僅是一個最佳實踐的問題。使用後視的正則表達式實際上會產生不正確的結果,因爲它允許後視部分重疊其他匹配。考慮這個輸入:

<a href="#" class="social google">Google</a> 

... 

<a class="bad">foo</a> 

你的正則表達式不僅會匹配「Google」;它也會匹配「foo」,因爲.+?應該只匹配類字符串的一部分,可以一直擴展到文本中的另一個鏈接。

+0

嗨,當我使用你的代碼''它仍然選擇帶標籤的整個文本。你能告訴我什麼是錯的嗎? – Giri 2013-02-11 15:17:47

+1

@Giri,您需要使用正確的Boost函數來獲取捕獲的子組,而不是整個事情。我不是一個Boost用戶,但它看起來像他們在這裏顯示如何做到這一點:http://www.boost.org/doc/libs/1_33_1/libs/regex/doc/captures.html – 2013-02-11 15:23:11

0

試試這個

"~<a(>| .*?>)(.*?)</a>~si" 

"/<a(>| .*?>)(.*?)</a>/" 

PHP樣本

$notecomments ='<a id="234" class="asf">fdgsd</a> <a>fdgsd</a>'; 

    $output=preg_replace_callback(array("~<a(>| .*?>)(.*?)</a>~si"),function($matches){ 
     print_r($matches[2]); 
     return ''; 
    },' '.$notecomments.' '); 

這個給你所有的錨文本

,這回只類= 「社會」

"#<a .*?class=\".*?social.*?\".*?>(.*?)</a>#" 

樣品

$notecomments ='<a id="234" class="fas social ads">fdgsd</a> <a>fdgsd</a>'; 

    $output=preg_replace_callback(array("#<a .*?class=\".*?social.*?\".*?>(.*?)</a>#"),function($matches){ 

    print_r($matches); 
return '';},' '.$notecomments.' '); 
+0

嗨但我不需要所有的錨文本。我只想要一個具有class =「social」的元素 – Giri 2013-02-11 15:29:40

+0

@Giri是的我瞭解查看變化。 – 2013-02-11 15:30:34

0

你可能會得到正確的結果,而是因爲你有其他匹配組(?...)你匹配還含有不希望數據。

你可以嘗試使用不匹配的組(?:...),並把你想什麼組本身

+0

實際上,可變長度後視可以在匹配之間重疊,導致正則表達式錯誤地匹配頁面中的其他鏈接和其他元素。 – 2013-02-11 15:52:09

0

試試這個正則表達式: -

\<a .*?\>(.*?)\<\/a\> 

編輯1這個表達式有CSS類「社會」錨匹配:

\<a .*?class=".*?\bsocial\b.*?\>(.*?)\<\/a\> 
+0

嗨,是的,我只想要一個class =「social」的元素 – Giri 2013-02-11 15:18:59

+0

@Giri:更新我的答案 – 2013-02-11 15:22:00