如何使用preg_replace创建自定义链接

时间:2015-01-02 07:25:08

标签: php regex preg-replace preg-match

我想创建与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

3 个答案:

答案 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

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

答案 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);