我想创建与preg_replace的链接,以显示带有自定义文本的链接标签。
这里的例子我想要
的输入
http://stackoverflow.com/ [click here]
输出
<a href="http://stackoverflow.com/">click here</a>
这是我正在尝试的代码,我对如何使用变量$ 1和$ 2感到困惑。
preg_replace(
"/(https?:\/\/[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]) \[((.*))\]/i",
"<a href=\"$1\">$2</a>",$text);
更多条件是,如果字符串末尾没有[click here]
,我想要<a href="$1">$1</a>
。
实施例
的输入
http://stackoverflow.com/ [click here] bla bla bla
http://www.google.com/ bla bla bla
输出
<a href="http://stackoverflow.com/">click here</a> bla bla bla
<a href="http://www.google.com/">http://www.google.com/</a> bla bla bla
答案 0 :(得分:1)
此外,您可以使用lookahead进行捕获,使用branch reset feature来获得所需的结果:
$pattern = '~(?=(https?://\S+))(?|\1 \[([^]]+)\]|(\1))~';
(?|\1 \[([^]]+)\]|(\1))
如果可用,将捕获[click here
]文本到第二个捕获组,否则粘贴第一个捕获组的匹配链接。
$str = preg_replace($pattern, '<a href="$1">$2</a>', $str);
节目输出:
<a href="http://stackoverflow.com/">click here</a> bla bla bla
<a href="http://www.google.com/">http://www.google.com/</a> bla bla bla
答案 1 :(得分:0)
您需要返回preg_replace
的返回值,您可以简化正则表达式:
$text = preg_replace('~(https?://\S+) +\[([^]]+)\]~i', '<a href="$1">$2</a>', $text);
根据您的修改,您可以:
$txt = 'http://stackoverflow.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://stackoverflow.com/">http://stackoverflow.com/</a> bla bla bla
答案 2 :(得分:0)
使用它:
([^\[]*)\[(.*?)\]
替换为:
<a href="$1">$2</a>
演示:https://regex101.com/r/lU8eO2/1
你的代码中的:
preg_replace('/([^\[]*)\[(.*?)\]/', '<a href="$1">$2</a>', $text);