【问题标题】:Regex lookahead with multiple negative conditions具有多个否定条件的正则表达式前瞻
【发布时间】:2013-09-16 22:03:44
【问题描述】:

我正在对 HTML 字符串执行正则表达式以获取 URL。我想获取所有不是 javascript 的 href 和 src。从另一个 SO 帖子我有以下模式:

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js).)*"/

这让我得到如下结果:

src="http://www.mydomain.com/path/to/resource/image.gif" alt="" border="0"

这很好,因为它缺少.js 结果。这很糟糕,因为它在元素中获取额外的标签。我尝试了以下修改以停止在第一个"

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js).)[^"]*"/

它的工作原理是它返回 href="$url",但它返回以 .js 结尾的结果。有没有办法结合一个负面的前瞻说:

  • 匹配字符串直到遇到另一个" - 即[^"]*
  • 不匹配以.js"结尾的字符串

提前感谢任何帮助/提示/指针。

【问题讨论】:

  • 什么风格的正则表达式 - 可以使用lookbehinds吗?即[^"]*(?<!\.js)(?=") 会做我认为你要问的事情,(但不适用于 JavaScript 正则表达式,因为它不支持后视)。
  • @PeterBoughton PCRE(PHP 的 preg_match_all())。环顾四周按预期工作,只是没有按预期工作。

标签: regex regex-lookarounds


【解决方案1】:

添加一个“?”到最后一个引号之前的“*”。这将使“*”非贪婪,即:它将在第一个引号处停止匹配,而不是最后一个

/(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js).)*?"/

【讨论】:

  • +1 即将发布同样的答案。如果他试图提取 URL,我会做一个(?:href|src)?
  • (["http 有错字。仅用"http 替换它会使正则表达式完美运行。是否可以对其进行编辑,以便我可以接受它作为未来用户的答案?
【解决方案2】:

这里有点不同。我用这个表达式使用了 Debuggex:

(?:src|href)=(?&.quotStr)(?<!\.js")

把它编译成这个:

$regex = '/(?:src|href)=(?:"((?:\\\\.|[^"\\\\]){0,})")(?<!\\.js")/';

Live Demo

【讨论】:

  • 感谢分享资源,以前没见过!
【解决方案3】:

如果你只想在字符串末尾拒绝.js,你可以使用下面的字符串匹配最后部分:

"(?![^"]*\.js").*?"

根据这个Rubular

【讨论】:

    【解决方案4】:

    编辑

    请参阅:https://stackoverflow.com/a/18838123/1163653 以获得更好的解决方案。

    已修复:

    /(href|src)?\="http:\/\/www\.mydomain\.com\/(?:(?!\.js"|").)*"/
    

    请注意,前瞻会检查任何不包含.js " 的字符串(在域之后),这两者都会导致它无效。它允许以.css 结尾的hrefs 通过,因为它们只有在到达第一个" 时才会失败,这是所需的行为。

    【讨论】:

    • 这也将拒绝字符串中间带有.js 的任何内容。这就是你想要的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多