我刚刚制作了一个正则表达式模式来替换HTML锚标签的链接,就是这样:
~((http\:\/\/|https\:\/\/)([^ ]+)) ~
我之所以这样问,是因为我刚刚完成了这个正则表达式,并用一些链接做了一些测试,它运行得很好,但我想确定这个模式没有错误(我是一个正则表达式并且也许正则表达专家可以告诉他的意见和/或建议。
顺便说一句,如果你在最后找出空间,你可能会认为如果字符串没有以空格结尾它将不起作用,但我的诀窍是在字符串之前将该空格添加到字符串中更换,然后在完成后再将其移除。
PD:
我没有处理链接的验证本身,我只是想搜索以http://开头并以空格结尾的字符串,没有别的,因为链接验证有点复杂。
编辑:
我的一些代码:
<?php
$patron = "~(https?:\/\/[^\s]+) ~";
//$patron = "~((http\:\/\/|https\:\/\/)([^ ]+)) ~";
$reemplazar = '<a href="$1">$1</a> ';
$cadena = "https://www.youtube.com/watch?v=7it5wioGixA ";
echo preg_replace($patron, $reemplazar, $cadena);
?>
答案 0 :(得分:2)
我认为这可以大大简化:
~(https?://\S+) ~
除此之外:对我来说没问题。
答案 1 :(得分:1)
使用相同的想法,您的模式可以缩短为:
~https?://[^\s"'>]+~ # don't forget to escape the quote you use.
将网址更改为链接:
$html = preg_replace_callback('~\b(?:(https?://)|www\.)[^]\s"\')<]++~',
function ($m) {
$pre = ($m[1]) ? $m[1] : 'http://';
if (filter_var($pre . $m[0], FILTER_VALIDATE_URL))
return '<a href="' . $m[0] . '">' . $m[0] . '</a>';
else return $m[0];
}, $html);
旧答案:
更改链接中的网址:
从所有“a”标签中提取所有href属性的更好方法是使用DOM。
$doc = new DOMDocument();
@$doc->loadHTML($htmlString);
$links = $doc->getElementsByTagName('href');
foreach($links as &$link) {
$href = $link->getAttribute('href');
$link->setAttribute('href', 'what you want');
}