使用preg_replace从括号内的文本建立链接

时间:2017-06-08 18:44:12

标签: php regex preg-replace

我想用PHP来转换这种格式的文本:

foo [[http://www.google.com|This Link points to google]] foo

到这个

foo <a href="http://www.google.com">This Link points to google</a> foo

我已经制作了这段代码:

function linkLine($line) {
    if (preg_match('#\[\[(.*?)\]\]#', $line, $match)) {
        $arr = explode("|", $match[1], 2);
        $link = "<a href=\"$arr[0]\">$arr[1]</a>";
        return str_replace($match[0], $link, $line);
    } else {
        return $line;
   }
}

但我知道这不优雅,不健壮,如果在同一行中出现多次,则不起作用。

如何使用preg_replace改善它?

2 个答案:

答案 0 :(得分:1)

您可以将同一个正则表达式与preg_replace_callback

一起使用
$re = '/\[\[(.*?)]]/';
$str = 'foo [[http://www.google.com|This Link points to google]] foo [[http://www.more.com|This Link points to more]]';
echo preg_replace_callback($re, function($m) { 
    $arr = explode("|", $m[1], 2);
    return '<a href="' . $arr[0] . '">'. $arr[1] . '</a>'; 
}, $str);

请参阅PHP demo

结果:

foo <a href="http://www.google.com">This Link points to google</a> foo <a href="http://www.more.com">This Link points to more</a>

如果[[]]中的字符串不能包含[]并且只有1 |,那么您也可以使用

$re = '/\[\[([^][|]*?)\|([^][]*?)]]/';

请参阅以下PHP demo

$re = '/\[\[([^][|]*?)\|([^][]*?)]]/';
$str = 'foo [[http://www.google.com|This Link points to google]] foo [[http://www.more.com|This Link points to more]]';
echo preg_replace($re, '<a href="$1">$2</a>', $str);

答案 1 :(得分:0)

就个人而言,我认为&#39;风格&#39;在使用正则表达式进行文本操作时,优先级列表中的优先级较低。在我看来,在该列表中更高的是首要的功能:它是否有效?大。其次是可读性:其他人可以理解它在做什么,如果有错误/错误,他们可以轻松解决吗?

也就是说,你改进它的动机是有效的,因为它没有达到你的一个功能要求,也就是说,如果在同一行中有多次出现。

那么为什么不一步一步地解决这个问题:

1)替换第一次出现的&#39; [[&#39;用&#39;

2)替换第一次出现的&#39; |&#39;在&#39; [[&#39;与&#39;&#34;&gt;&#39;。

(这是一个棘手的问题,因为它需要您做出决定。对于以下示例,您更喜欢哪两种结果?:

3)foo [[http://www.google.com|This链接指向]] google]] foo

我将第一次使用&#39;]]&#39;。如果您想捕获外部括号,那么您需要使用前瞻来检查以确保不再有&#39;]]&#39;之前&#39; [[&#39;。

按照上述步骤,我想出了(在javascript中,所以我可以展示一个例子):

&#13;
&#13;
let regex = /(.*)(\s\[\[)(http:\/\/[^|]+)(\|)((.*)(?=\b)(\]\]\s))(.*)/;

let result = "foo [[http://www.google.com|This Link points to google]] foo".replace(regex,'$1 <a href="$3"/>$6</a> $8');

let pathologicalDataResult = "foo [[http://ww[[w.google.co|m|This Link poi]]nts to google]] foo".replace(regex,'$1 <a href="$3"/>$6</a> $8');

console.log(result);
console.log(pathologicalDataResult);
&#13;
&#13;
&#13;