不知道如何在preg_replace中继续允许或防止在URL中的下划线和冒号处进行剪切。也不知道有什么其他特殊字符,我可能会错过,将剪断网址
$text = preg_replace_callback('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', function($m) {
return '<a href="' . $m[1] . '" target="_blank">' . substr($m[1], 0, 75) . '</a>';
}, $text);
字符串
文本链接可能显示为https://something.com/something_something:moresomething,但它只链接https://something.com/something _something:moresomething。我在这个例子中使用了两个符号,但它也单独使用。
1条答案
按热度按时间1wnzp6jl1#
在这一部分中缺少了一个冒号
[-\w/_\.:]*
,但由于在回调代码中只使用了$m[1]
,因此可以简化模式,完全省略捕获组,使用$m[0]
的完全匹配。注意,你不必在字符类中转义点
\.
,\w
也匹配_
,所以你不必单独添加到字符类中。字符串
模式匹配:
https?://
将协议与可选的s
匹配(?:[-\w.]+)+
重复1+次匹配字符类中列出的一个(?::\d+)?
可选匹配:
和1+位数(?:
非捕获组/
按字面匹配(?:
非捕获组[-\w/.:]*
可选重复匹配字符类中列出的一个字符(?:\?\S+)?
可选匹配?
和1+个非空格字符)?
关闭非捕获组并使其可选)?
关闭非捕获组并使其可选比如说
型
产出
型