我正在尝试使用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相匹配。感谢您的任何意见。
答案 0 :(得分:2)
你可以试试正则表达式:
href="([^"]*)">(?=(?:(?!href).)*textABCXYZ123)
喜欢这样吗?
$find_string = 'ABCXYZ123';
preg_match('~href="([^"]*)">(?=(?:(?!href).)*text'.$find_string.')~sU',$html,$match);
第一部分是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))
也可以试试这个,如果你想要一个解释,请告诉我