RegEx - 链接HTML文本中的URL

时间:2013-03-01 08:32:02

标签: html regex url hyperlink anchor

想象一下以下字符串

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>

问题是我发现的每个解决方案都会破坏第三行上已链接的网址,或者不会将<p>标记中的网址链接起来。

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

1 个答案:

答案 0 :(得分:1)

这是一个传递你的测试用例的正则表达式 - 它是.Net语法我害怕,而不是PHP

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

替换字符串:

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

细分和解释

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

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