【问题标题】:How do I skip the domain that is already in an anchor tag?如何跳过已经在锚标记中的域?
【发布时间】:2013-09-06 01:20:03
【问题描述】:

下面的正则表达式found here 很好地匹配了下面的域,但我不希望它匹配已经在锚标记中的域(最后一个示例)请注意,这种匹配将检测这些情况文本的句子。

((?: http| https)://)?[.0-9a-z-]+\.[a-z]{2,6}(?::[0-9]{1,5}+)?(?:/[!$'()*+,._a-z-]++){0,9}(?:/[!$'()*+,._a-z-]*)?(?:\?[!$&'()*+,.=_a-z-]*)?

在句子或段落中匹配:

www.domain.com
domain.com
this.is.a.special.url.domain.com/hello 
http://domain.com
http://www.domain.com
http://www.domain.com/
http://www.domain.com/index.html
http://www.domain.com/index.html?source=library

但是,如何将正则表达式更改为与锚标记中已有的域不匹配?

<a href="http://www.usertesting.com">hello</a>

【问题讨论】:

  • 不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。请参阅htmlparsing.com/phpthis SO thread,了解如何使用已经编写、测试和调试过的 PHP 模块正确解析 HTML。
  • @AndyLester,谢谢,但我不解析 html,我正在跳过 html,只寻找非 html 网址。
  • 我明白这一点,识别文件的哪一部分是标记,哪一部分是文本,确实是在解析 HTML。

标签: regex html-parsing


【解决方案1】:

您可以添加否定的lookbehind 以排除href="href=' 之后的匹配项,如下所示:

(?<!href=["'])((?: http| https)://)?[.0-9a-z-]+\.[a-z]{2,6}(?::[0-9]{1,5}+)?(?:/[!$'()*+,._a-z-]++){0,9}(?:/[!$'()*+,._a-z-]*)?(?:\?[!$&'()*+,.=_a-z-]*)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2017-11-26
    • 2022-11-27
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多