【问题标题】:Inaccurate preg_match with '.jpg' patternpreg_match 与“.jpg”模式不准确
【发布时间】:2011-10-19 05:36:00
【问题描述】:

我使用preg_match$pattern = '/src="http:\/\/(.*?).jpg"/s'; 模式从网页上抓取jpeg 图像的网址。但是,这还不够准确,因为它还抓取了http://www.domain.com/image.png"> Yadayada <img src="anotherpic.jpg

其他时候,它会抓取像

这样的东西

http://maps.google.com/maps/api/staticmap?center=42.34,-71.18&path=weight:4|42.338,-71.177|42.338,-71.183|42.342,-71.183|42.342,-71.177|42.338,-71.177&zoom=15&size=335x225&sensor=false" width="280" height="188" alt=""></td></tr> <tr><td height="10"></td></tr></table></td></tr></table></td></tr><tr><td height="10 valign="> </td></tr><tr><td valign="top" background="http://www.coolapartments.info/img/java-footer_bg.jpg

如何改进模式以防止像上面 2 个示例那样不必要的匹配?

【问题讨论】:

  • @erisco 不值得一提,因为有趣的答案是错误的。
  • 丢弃发生的整个讨论的奇怪标准。
  • @erisco 没有人阅读发生的讨论。现在,该答案仅用于使用正则表达式问题解决所有解析 html。为此,我们有更好的规范。
  • 哦,我明白了。然后看这里:stackoverflow.com/questions/3577641/…

标签: php regex screen-scraping preg-match


【解决方案1】:

(.*?).jpg 替换为([^"]*)\.jpg 以避免跨越src 属性的双引号边界。 src="([^"]*)\.jpg" 甚至可以更通用,而不匹配 http

【讨论】:

  • 您可以限制字符类也不允许单引号或楔形括号。
【解决方案2】:

使用 DOM 和这个 XPath

//@src[contains(,. '.jpg')]

匹配某处包含字符串“.jpg”的元素的所有 src 属性。

如果属性应该以“.jpg”结尾,请使用

//@src[substring(., string-length(.) - 4) = '.jpg']

相当于 XPath 2.0 函数的结尾。

使用 DOM 和 XPath 的主要好处是它只会对 src 属性进行操作,而您的正则表达式可以匹配任何地方。这里有很多 DOM 和 XPath 的使用示例:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多