我一直试图让它工作一段时间但不能。这是我的问题:
我有以下注册。表达式:(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?
。我正在尝试验证网址。
问题出在我的时候:
“https://www.youtube.com/watch?v=QK8mJJJvaes<br />Hello
”(这是使用nl2br在数据库中保存的方式)
它最终验证了这一点:https://www.youtube.com/watch?v=QK8mJJJvaes<br
。我读过这个问题可能是因为reg中的\S*
。表达。但如果我把它拿出来只会验证https://www.youtube.com/
。
我还想过在<br />
之前添加一个空格,但我不知道它们是否是更好的解决方案。
非常感谢任何帮助:)。
完整代码:
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
// The Text you want to filter for urls
$finalMsg = 'https://www.youtube.com/watch?v=QK8mJJJvaes<br />Hello';
// Check if there is a url in the text
if(preg_match_all($reg_exUrl, $finalMsg, $url)){
// make the urls hyper links
$matches = array_unique($url[0]);
foreach($matches as $match) {
$replacement = "<a href=".$match." target='_blank'>{$match}</a>";
$finalMsg = str_replace($match,$replacement,$finalMsg);
}
}
答案 0 :(得分:1)
将其更改为:
/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S[^<]*)?/
这至少会验证您的指定网址以及以标记结尾的任何其他网址...
在此测试:https://regex101.com/
编辑:不匹配根路径。 @Jonathan Kuhn在评论中提出的解决方案是最好的解决方案:
/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/[^\s<]*)?/
<强>更新强>
重新回顾一些旧的答案,我很恼火,为什么我像我一样评论..但我看不到问题,你的代码是有效的。 :d
虽然这段短代码也会这样做:
$url = "https://www.youtube.com/watch?v=QK8mJJJvaes<br />Hello";
$regex = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/[^\s<]*)?/';
// make the URLs hyperlinks
$url = preg_replace($regex, '<a href="$0" target="_blank">$0</a>', $url);
echo $url;