Php 查找href的最后一次出现

Php 查找href的最后一次出现,php,regex,Php,Regex,我试图找到一个链接使用regexp,它出现在下面的HTML文本abcxyz123字符串之前 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</spa

我试图找到一个链接使用regexp,它出现在下面的HTML文本abcxyz123字符串之前

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

有人能指导我如何在字符串文本ABCXYZ123之前捕获该链接吗?另外,我知道xpath和简单HTMLDOM,但我想与regexp匹配。感谢您的输入。

您可以尝试使用正则表达式:

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

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


第一部分是
href=“([^”]*)”>
,应该不难理解。它匹配
href=“
,然后是任意数量的非引号字符,后面是引号和

(?=(?:(!href)。*textABCXYZ123)
首先是积极的前瞻。(正向前瞻的格式为
(?=…)
),它将确保内部有匹配项

例如,
a(?=.*b)
匹配任何
a
,只要有任何字符,那么a
b
a
之后的某个地方(也意味着它匹配
a
,只要后面有a
b

因此,
href=“([^”]*)”>
将仅在前面某处有
(?:(?!href)。*textABCXYZ123
时匹配

(?:(?!href.)*
是一个修改后的
*
,因为负前瞻(格式
(?!…)
)确保没有匹配的
href
。可以说它与正前瞻相反:


a(?。*b)
匹配任何
a
,只要它后面没有a
b

(?s)href=[^您可能想看一看这个以找到最后一个事件。非常感谢,这正是我想要的,请您解释一下您的模式。我对正则表达式非常熟悉,这将对学习有很大帮助。再次感谢。@user969068添加了一些解释。希望这不太难理解:)非常感谢您的帮助努力。非常有用。非常感谢…最好的解释!+1
(?s)href=[^<]+</a>(?!.*(href).*(textABCXYZ123))(?=.*(textABCXYZ123))
(?s)href=[^<]+</a>(?!.*(href).*(textABCXYZ123))(?=.*(textABCXYZ123))