我有这个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
的回调版本。
答案 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>