如何使用 preg replace 创建自定义 link

How to create custom link with preg replace

我想创建带有 preg_replace 的 links,显示带有自定义文本的 link 标签。

这里是我要的例子
输入

http://whosebug.com/ [click here]

输出

<a href="http://whosebug.com/">click here</a>

这是我正在尝试的代码,我对如何使用变量 $1 和 $2 感到困惑。

preg_replace(
"/(https?:\/\/[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]) \[((.*))\]/i",
"<a href=\"\"></a>",$text);

已更新

更多的条件是,如果没有 [click here] 出现在字符串的末尾,我想要这个 <a href=""></a>.

例子
输入

http://whosebug.com/ [click here] bla bla bla
http://www.google.com/ bla bla bla

输出

<a href="http://whosebug.com/">click here</a> bla bla bla
<a href="http://www.google.com/">http://www.google.com/</a> bla bla bla

您需要重新分配 preg_replace 的 return 值,您可以简化正则表达式:

$text = preg_replace('~(https?://\S+) +\[([^]]+)\]~i', '<a href=""></a>', $text);

根据您的编辑,您可以执行:

$txt = 'http://whosebug.com/  bla bla bla';

$txt = preg_replace_callback('~(\bhttps?://\S+)(?:\s+\[([^]]+)\])?~i',
    function ($m) { $s='<a hr'.'ef="'.$m[1].'">';
         $s .= isset($m[2])? $m[2]:$m[1]; return $s.'</a>';}, $txt);

echo $txt;
//=> <a href="http://whosebug.com/">http://whosebug.com/</a> bla bla bla

使用这个:

([^\[]*)\[(.*?)\]

替换为:

<a href=""></a>

此处演示:https://regex101.com/r/lU8eO2/1

在您的代码中:

preg_replace('/([^\[]*)\[(.*?)\]/', '<a href=""></a>', $text);

您也可以使用 lookahead for capturing and the branch reset feature 来达到预期的效果:

$pattern = '~(?=(https?://\S+))(?| \[([^]]+)\]|())~';

(?| \[([^]]+)\]|()) 将捕获到第二个捕获组 [click here] 文本(如果可用),否则从第一个捕获组粘贴匹配的 link。

$str = preg_replace($pattern, '<a href=""></a>', $str);

程序输出:

<a href="http://whosebug.com/">click here</a> bla bla bla
<a href="http://www.google.com/">http://www.google.com/</a> bla bla bla

Test at regex101.com; PHP test at eval.in