1

想象下面的字符串

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,或者不链接<p>标签中的 url。

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

4

1 回答 1

1

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

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

和替换字符串:

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

故障和解释

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

  1. (?<=(?:[^a-z0-9]|^))
    • 断言背后的正面看法 - url 前面有一个非协议字符(或者是字符串的开头)
  2. (?<!href=["'])
    • 断言背后的负面看法 - url 前面没有 href 属性
  3. ([a-z0-9]+:\/\/[^\s<>\(\)\[\]'"]+)
    • 捕获 URL
    • 括号组,所以我们可以在替换表达式中使用它
    • This is a very simple URL matching expression - protocol, followed by ://, followed by one or more "non-URL" characters. You might want to replace it with something better.
  4. (?=[\s<>\(\)\[\]'"])
    • Positive lookahead assertion - url is followed by a non-url character
  5. (?!</a>)
    • Negative lookahead assertion - url isn't followed by a closing </a> tag
于 2013-03-01T09:07:27.197 回答