【问题标题】:PREG_MATCH ProblemPREG_MATCH 问题
【发布时间】:2011-07-30 21:36:29
【问题描述】:
preg_match("/<img onClick='this\.style\.maxWidth=\"490px\"; this\.style\.maxHeight=\"490px\";
this\.style\.cursor=\"default\";' style='cursor: pointer; display: block; float: left; max-width: 
490px; max-height: 160px;' src='(.)+'><br style='clear: left;'>/",$CONTENT,$MATCHES);
print_r($MATCHES);

为什么这个获取不到图片源?

【问题讨论】:

  • 哇。先将 CSS 和 JS 从 HTML 中分离出来,然后我们将讨论正则表达式...
  • 感谢您没有回答我的问题...顺便说一句,我发现它不起作用,因为我放的是 (.)+ 而不是 (.+) .....
  • 感谢您写出如此不清楚的问题...人们需要阅读此内容。顺便说一句,我不是反对者。
  • 你能发布你试图解析的 HTML 源代码吗?提供帮助会更容易。我写了一些通用的正则表达式,它可能对你的情况有用。应用此正则表达式后,您可以从第 1 组 (results[1]) 中提取结果以获取图像 src。 img[^\>]*[src]\s*=\s*[\"\']{0,1}([^\"\'\>])
  • 我不敢相信那些讨厌正则表达式的人还没有发表评论说使用正则表达式解析 HTML 如何有助于 Cthulhu 的崛起!

标签: php regex preg-match


【解决方案1】:

考虑写src='(.+)' 而不是src='(.)+'

【讨论】:

    【解决方案2】:

    你可以跳过很多东西,直接说

    preg_match("/<img.*?src='([^']*)'/i", $content, $matches);
    

    $matches[1] 将是源网址

    (在 cmets 失控之前:这是基于问题中的原始模式。它不匹配双引号属性,因为原始模式也不匹配。而且它也不是一个通用的解决方案。它会寻找 1 个格式良好的 img 标签,就是这样)


    除此之外:

    • 内联 CSS?!
    • 内联事件处理程序?!
    • 单引号围绕属性?!哎呀!那个错了!道歉

    这些都不好!

    【讨论】:

    • 这可能适用于这种情况,但它通常不是有用/正确的正则表达式模式。
    • @Dor:请详细说明。我的意思是,是的,html 一开始就很糟糕,但是模式有什么问题?
    • 如果主题字符串包含 2 个或更多 img 标签,那么您的旧正则表达式(在您编辑之前)可能与最新 img 标签的 src 属性匹配。现在,在您编辑正则表达式后,当this.src='val' 之类的内容用 javascript 编写(可能在 OnClick 事件值中)时,该模式可能与 src 属性的值匹配
    • 你的模式匹配不正确的 Html 语法。例如,这样的东西可以与您的模式匹配 src='/images/prijavise-facebook.gif'
    • @Flambino 你有没有考虑过单引号和双引号可以用来引用src?
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多