PHP-preg_replace-如果当前一个为空,则使用其他替换

时间:2018-11-11 10:38:43

标签: php regex preg-replace

我有这个preg_replace

preg_replace('/\[link=(.*?)\](.*?)\[\/link\]/', '<a href="\1">\2</a>', $input);

对于此数据

$input = "[link=xxx]xxx[/link] [link=yyy][/link]"

它产生:

<a href="xxx">xxx</a> <a href="yyy"></a>

但是,我希望结果是

<a href="xxx">xxx</a> <a href="yyy">yyy</a>

我可以以某种方式使用\2,如果字符串为空,则在替换\1时使用preg_replace?我不想使用preg_replace的回调版本。

1 个答案:

答案 0 :(得分:2)

正如@mario指出的那样,您需要使用preg_replace_callback来解决此类问题。在回调中,您可以检查是否存在第二个组匹配,如果没有,请在<a>元素内重复第一个匹配:

$input = "[link=xxx]xxx[/link] [link=yyy][/link]";
echo preg_replace_callback('/\[link=(.*?)\](.*?)\[\/link\]/', 
                           function ($m) { 
                               return "<a href=\"$m[1]\">" . (strlen($m[2]) ? $m[2] : $m[1]) . '</a>'; 
                           },
                           $input);

输出

<a href="xxx">xxx</a> <a href="yyy">yyy</a>

Demo on 3v4l.org