TextArea 中 URL 的preg_replace_callback在下划线或冒号处被截断

preg_replace_callback of url in textarea cuts off at underscore or colon

提问人:Rubbish 提问时间:3/17/2023 最后编辑:Rubbish 更新时间:8/4/2023 访问量:57

问:

不确定如何继续允许或防止在此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。我在此示例中使用了这两个符号,但它也单独使用。

php 正则表达式 preg-replace

评论

2赞 The fourth bird 3/17/2023
“截取网址”是什么意思?您能否使用模式应匹配的示例字符串以及您想要的结果或您想要完成的任务来更新问题?
0赞 Rubbish 3/18/2023
@Thefourthbird 生成 url 时,它不包含下划线或冒号后的任何内容。我将尝试在上面展示。

答:

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>