[英]Regular expressions in PHP / find “<a> </a>”
我想检查一个文本区域。 如果用户在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
谢谢你的帮助!
我不熟悉PHP,也许这不是用于URL验证的好模式,但是要点是,如果已经有一个“ a”标记,则不会替换文本。
<?php
$message = array(
'Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>',
"Hello .... http://www.test.com ..."
);
$url = '@(<a[^>]*>[^<]+</a>|((https?://)?[\w\.-]+\.[a-zA-Z]{2,3}[^\s\W]*))@';
foreach ($message as $msg) {
preg_match($url, $msg, $matches);
if(preg_match($url, $msg) == 1 && count($matches) > 2) {
$msg = preg_replace($url, '<a href="$0" target="_blank" rel="nofollow" title="$0">$0</a>', $msg);
}
echo $msg.PHP_EOL;
}
// Output:
// Hello ... <a href="http://test.com" target="_blank" rel="nofollow" title="test.com">test.com</a>
// Hello .... <a href="http://www.test.com" target="_blank" rel="nofollow" title="http://www.test.com">http://www.test.com</a> ...
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.