【发布时间】:2017-09-19 00:49:54
【问题描述】:
我想检查一个文本区域。如果用户在 textarea 中输入一些链接,php 应该自动标记这些链接。我正在使用此代码:
$message = "text with some link within";
$url = '@(?!<a[^>]*?>)(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])(?![^<]*?</a>)@';
if(preg_match($url, $message) == 1){
$message = preg_replace($url, '<a href="http$2://$4" target="_blank" rel="nofollow" title="$0">$0</a>', $message);
}
问题是,当已经有一个带标签的链接(带有“a”标签)时,正则表达式正在破坏该链接。
这是一个例子:
来自 textarea 的第一个输入:Hello .... test.com
由正则表达式更改:Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>
这工作正常,但如果你更新这个:
Hello ... http://test.com" target="_blank" rel="nofollow" title="test.com" target="_blank" rel="nofollow" title="test.com">test.com">test.com">test.com
感谢您的帮助!
【问题讨论】:
-
不要使用正则表达式解析HTML,使用像
DOMDocument这样的DOM解析器库。 -
正如您在示例中看到的那样,我正在寻找一种仅标记没有 标记的链接的方法...最大的问题是,如果我再次编辑帖子,正则表达式将另一个 标记添加到前一个 标记,所以最后链接根本不起作用