PHP - preg_replace - использовать другую подстановку, если текущая подстановка пуста - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть 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, и если строка пуста, вместо preg_replace использовать \1? Я не хочу использовать версию обратного вызова preg_replace.

1 Ответ

0 голосов
/ 11 ноября 2018

Как отметил @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>

Демонстрация на 3v4l.org

...