如何使用 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
我想创建带有 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