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


preg_match pattern where a specific character should not come before another

我正在从一个网站中提取一些图像URL。为此,我使用以下正则表达式:

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

然而,这将在这样的线路上给出错误的结果:

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

我无法搜索<img标签,因为有些图像来自javascript。

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

因此,解决我的问题的方法是更改regex,使其不允许在"http"answers"jpg"之间有任何"字符

伪代码中有类似的内容

preg_match_all('#"(http.?:(anything except ")?jpg)"#', $html, $matches);

你是怎么做到的?

您可以在正则表达式中使用否定来确保httpjpg:之间不匹配"

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

Regex演示

需要注意的是,使用正则表达式解析HTML并不是废弃网页的最佳方式。您可以考虑使用DOM解析器。

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

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

演示

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