【问题标题】:RegEx - Linking an URL in a html textRegEx - 在 html 文本中链接 URL
【发布时间】:2023-04-07 16:29:01
【问题描述】:

想象下面的字符串

http://somedomain.com
<p>http://somedomain.com</p>
<a href="http://somedomain.com">http://somedomain.com</a>

我需要一个函数或正则表达式将其转换为。

<a href="http://somedomain.com">http://somedomain.com</a>
<p><a href="http://somedomain.com">http://somedomain.com</a></p>
<a href="http://somedomain.com">http://somedomain.com</a>

问题是我找到的每个解决方案都会破坏第三行已经链接的url,或者不链接&lt;p&gt;标签中的url。

PHP 解决方案会很好,但不是必需的。

【问题讨论】:

    标签: html regex url hyperlink anchor


    【解决方案1】:

    这是一个通过您的测试用例的正则表达式 - 恐怕是 .Net 语法,而不是 PHP

    (?<=(?:[^a-z0-9]|^))(?<!href=["'])([a-z0-9]+:\/\/[^\s<>\(\)\[\]'"]+)(?=[\s<>\(\)\[\]'"])(?!</a>)
    

    以及替换字符串:

    <a href='$1'>$1</a>
    

    分解与解释

    正则表达式由 5 个部分组成:

    1. (?&lt;=(?:[^a-z0-9]|^))
      • 断言背后的正面看法 - url 前面有一个非协议字符(或者是字符串的开头)
    2. (?&lt;!href=["'])
      • 断言背后的负面看法 - url 前面没有 href 属性
    3. ([a-z0-9]+:\/\/[^\s&lt;&gt;\(\)\[\]'"]+)
      • 捕获 URL
      • 括起来的组,所以我们可以在替换表达式中使用它
      • 这是一个非常简单的 URL 匹配表达式 - 协议,后跟 ://,后跟一个或多个“非 URL”字符。您可能想用更好的东西替换它。
    4. (?=[\s&lt;&gt;\(\)\[\]'"])
      • 正向前瞻断言 - url 后跟非 url 字符
    5. (?!&lt;/a&gt;)
      • 否定的前瞻断言 - url 后面没有结束 &lt;/a&gt; 标记

    【讨论】:

    • 它有效。对于 php preg_replace 我只需要将其更改为。 @(? ()[]\'"]+)(?=[\s()[]\'"])(?!)@ 请注意,我删除了第一部分中的 |^,因为 php不支持查看非固定长度的断言。但它仍然有效,即使链接从文本开头开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2011-05-21
    • 2010-12-29
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多