找到最后一次出现的href

时间:2014-01-08 16:54:55

标签: php regex

我正在尝试使用regexp找到一个链接,该链接出现在HTML下面的textABCXYZ123字符串之前。

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........

有许多链接,我需要捕获textBCXYZ123字符串之前出现的链接。我尝试下面的正则表达式,但它返回我的第一个链接而不是最后一个:

$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,但我想与regexp相匹配。感谢您的任何意见。

2 个答案:

答案 0 :(得分: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,只要有任何字符,然后在b之后的某处a(也就是说它匹配{{1}只要在它之后的某个地方有一个a

因此,b只有在前方某处href="([^"]*)">时才会匹配。

(?:(?!href).)*textABCXYZ123是经过修改的(?:(?!href).)*,因为否定前瞻(格式为.*)可确保不匹配(?! ... )。你可以说它与积极向前看相反:

只要不是后跟href

a(?!.*b)就会匹配任何a

答案 1 :(得分:1)

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

也可以试试这个,如果你想要一个解释,请告诉我