提问人:Rubbish 提问时间:3/17/2023 最后编辑:Rubbish 更新时间:8/4/2023 访问量:57
TextArea 中 URL 的preg_replace_callback在下划线或冒号处被截断
preg_replace_callback of url in textarea cuts off at underscore or colon
问:
不确定如何继续允许或防止在此preg_replace中 url 中的下划线和冒号处截图。也不确定我可能缺少哪些其他特殊字符来截取网址
$text = preg_replace_callback('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', function($m) {
return '<a href="' . $m[1] . '">' . substr($m[1], 0, 75) . '</a>';
}, $text);
文本链接可能显示为 https://something.com/something_something:moresomething,但它仅链接 https://something.com/something _something:moresomething。我在此示例中使用了这两个符号,但它也单独使用。
答:
0赞
The fourth bird
8/4/2023
#1
这部分缺少冒号,但由于您只在回调代码中使用,因此您可以简化模式并完全省略使用捕获组,并使用[-\w/_\.:]*
$m[1]
$m[0]
请注意,您不必在字符类中转义点,并且还需要匹配,因此您不必将其单独添加到字符类中。\.
\w
_
https?://(?:[-\w.]+)+(?::\d+)?(?:/(?:[-\w/.:]*(?:\?\S+)?)?)?
该模式匹配:
https?://
将协议与可选协议匹配s
(?:[-\w.]+)+
重复 1+ 次,匹配字符类中列出的字符之一(?::\d+)?
可选匹配和 1+ 数字:
(?:
非捕获组/
从字面上匹配(?:
非捕获组[-\w/.:]*
(可选)重复匹配字符类中列出的字符之一(?:\?\S+)?
(可选)匹配和 1+ 非空格字符?
)?
关闭非捕获组并将其设置为可选
)?
关闭非捕获组并将其设置为可选
例如
$text = "https://something.com/something_something:moresomething";
$pattern = '@https?://(?:[-\w.]+)+(?::\d+)?(?:/(?:[-\w/.:]*(?:\?\S+)?)?)?@';
$text = preg_replace_callback($pattern, function($m) {
return '<a href="' . $m[0] . '">' . substr($m[0], 0, 75) . '</a>';
}, $text);
echo $text;
输出
<a href="https://something.com/something_something:moresomething">https://something.com/something_something:moresomething</a>
评论