preg_match模式,其中特定字符不应该在另一个之前

时间:2014-09-09 11:05:17

标签: php regex

我从网站上提取了一些图片网址。 为此,我使用了这个正则表达式:

preg_match_all('#"(http.*?jpg)"#', $html, $matches);

然而,这会在这样的行上产生错误的结果:

<a href="http://omg.com/test.html"><img src="http://omg.com/image.jpg"></a>

我无法搜索<img代码,因为有些图片来自javascript。

但可以肯定的是,所有图像都被两个""

包围

那么解决我的问题的方法是将我的正则表达式更改为不允许在&#34; http&#34;之间使用任何"个字符。和&#34; jpg&#34;

伪代码

中有类似的东西
preg_match_all('#"(http.?:(anything except ")?jpg)"#', $html, $matches);

你是怎么做到的?

2 个答案:

答案 0 :(得分:4)

您可以在正则表达式中使用否定,以确保在"http之间不匹配jpg

preg_match_all('#"(http[^"]*jpg)"#i', $html, $matches); 

<强> Regex Demo

虽然使用正则表达式解析HTML并不是废弃网页的最佳方法,但要谨慎。您可以考虑使用DOM解析器。

答案 1 :(得分:2)

你可以试试下面使用否定字符类的正则表达式。

"(http[^<>]*jpg)"

DEMO

[^<>]*这可确保<>字符串之间不存在httpjpg个符号。