2014-01-08 42 views
2

我正在嘗試使用正好出現在textABCXYZ123字符串之前的regexp來查找下面的HTML鏈接。查找href的最後一個匹配項

lorem ispum...<strong><a href="http://www.site.com/link/123">FIRSTlink</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>ANOTHERLINK</span>. 
... more text........... more text........ 
... more text.......<strong><a href="http://www.site.com/link/123">other link</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>ANOTHERLINK</span>. 
... more text........... more text........ 
<strong><a href="http://www.IneedThis.com/link/123">somewhere to go</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>textABCXYZ123</span> 
... 
... more text..........<strong><a href="http://www.site.com/link/123">other link</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>ANOTHERLINK</span>. 
... more text........... more text........ 

有很多鏈接,我需要捕獲出現在textABCXYZ123字符串前面的鏈接。我想下面的正則表達式,但它返回我第一個鏈接,而不是最後一個:

$find_string = 'ABCXYZ123'; 
preg_match('#href="(.*)".*text'.$find_string.'#sU',$html,$match); 
// so final resutl is "http://www.site.com/link/123" which is first link 

有人能指導我怎麼可以只是我的串textABCXYZ123之前捕獲的鏈接? P.S我知道xpath和簡單的html dom,但我想用正則表達式匹配。感謝您的任何意見。

+0

你可能想看看這個 http://stackoverflow.com/questions/13618077/php-regex-to - 匹配查找最後一次匹配的最後一個字符串。 – Braunson

回答

2

也許你可以嘗試的正則表達式:

href="([^"]*)">(?=(?:(?!href).)*textABCXYZ123) 

像這樣嗎?

$find_string = 'ABCXYZ123'; 
preg_match('~href="([^"]*)">(?=(?:(?!href).)*text'.$find_string.')~sU',$html,$match); 

regex101 demo


第一部分爲href="([^"]*)">,不應該太難理解了。它匹配href=",然後匹配任意數量的非引號字符,然後加引號和>

(?=(?:(?!href).)*textABCXYZ123)首先是積極的向前看。 (積極向前的格式爲(?= ...))它會確保裏面有什麼可以說有匹配。

例如,a(?=.*b)匹配任何a,只要有任何字符,那麼a後某處b(也意味着只要有後一個b地方匹配a)。

因此,href="([^"]*)">只有在前面某處有(?:(?!href).)*textABCXYZ123時纔會匹配。

(?:(?!href).)*是修改後的.*,因爲負面預測(格式​​(?! ...))確保沒有href匹配。你可以說這是一個積極的向前看的反面:

a(?!.*b)只要是接着是b任何a匹配。

+0

非常感謝,正是我想要的,請您解釋一下您的模式。我非常喜歡正則表達式,這對學習有很大的幫助。再次感謝。 – user969068

+0

@ user969068添加了一些更多解釋。希望,這不是很難理解:) – Jerry

+0

非常感謝您的努力。非常有用。不能感謝足夠的...最好的問候 – user969068

1
(?s)href=[^<]+</a>(?!.*(href).*(textABCXYZ123))(?=.*(textABCXYZ123)) 

也可以試試這個,讓我知道如果你想要一個移出

相關問題