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

PHP - preg_replace - use other substitution if the current one is empty

我有这个preg_replace

preg_replace('/\[link=(.*?)\](.*?)\[\/link\]/', '<a href=""></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>

我能否以某种方式使用 </code>,如果字符串为空,则在 <code>preg_replace 替换中使用 </code>?我不想使用 <code>preg_replace.

的回调版本

正如@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