regex preg_replace_callback在文本区域中的URL在下划线或冒号处截断

lrl1mhuk  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(93)

不知道如何在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。我在这个例子中使用了两个符号,但它也单独使用。

1wnzp6jl

1wnzp6jl1#

在这一部分中缺少了一个冒号[-\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] . '" target="_blank">' . substr($m[0], 0, 75) . '</a>';
}, $text);

echo $text;


产出

<a href="https://something.com/something_something:moresomething" target="_blank">https://something.com/something_something:moresomething</a>

相关问题