Определите и замените пары сокращенных переменных в строке в PHP с помощью preg_replace - PullRequest
0 голосов
/ 01 августа 2020

Прежде, чем кто-либо спросит, я потратил час, пытаясь найти решение для SO, и, похоже, ничего не достигло именно того, чего я хочу ... если он там, я прошу прощения!

Итак ... Я пытаюсь запустить preg_replace для кучи текста, чтобы заменить пары шорткодов.

Пример текста:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]Abc123[/img][cap]This is an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]321cbA[/img][cap]This is also an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.

Я хочу взять каждое изображение и подпись вместе и замените их как таковые:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
<img src="Abc123.jpg" alt="This is an image" />
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
<img src="321cbA.jpg" alt="This is also an image" />
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.

Код, который мне нужен, будет примерно таким:

$text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]Abc123[/img][cap]This is an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]321cbA[/img][cap]This is also an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.";

$pattern = '/\[(img)\](.*?)\[\/\1\]?/';
// This doesn't work: $pattern = '/\[(img)\](.*?)\[\/\1\]\[(cap)\](.*?)\[\/\4\]?/';

$replacement = '<img src="$2.jpg" alt="Help" />';
// "Help" will be $5 when we get both values

echo preg_replace($pattern, $replacement, $text);

Этот код принимает одно значение, но я не могу на всю жизнь получить шаблон, чтобы выбрать оба значения (закомментированная строка выше, насколько я могу). Я пробовал десятки страниц SO и других веб-сайтов, но ничего не работает. Без сомнения, исправленный шаблон будет простым, но если бы кто-то мог избавить меня от моих страданий, я был бы очень признателен!

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Я адаптировал ваш код следующим образом:

$text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]Abc123[/img][cap]This is an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]321cbA[/img][cap]This is also an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.";

$pattern = '/\[img\](\w+)\[\/img\]\[cap\]([\w\s]+)\[\/cap\]/';
// This doesn't work: $pattern = '/\[(img)\](.*?)\[\/\1\]\[(cap)\](.*?)\[\/\4\]?/';

$replacement = '<img src="$1.jpg" alt="$2" />';
// "Help" will be $5 when we get both values

echo preg_replace($pattern, $replacement, $text);

Я изменил только шаблон и строку замены.

0 голосов
/ 01 августа 2020
$str = <<<'EOD'
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]Abc123[/img][cap]This is an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
[img]321cbA[/img][cap]This is also an image[/cap]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.
EOD;

$trans = ['[img]' => '<img src="', '[/img][cap]' => '" alt="', '[/cap]' => '" />'];

echo strtr($str, $trans);

demo

Также последняя ссылка в вашем коде должна быть \3 не \4 (но действительно ли вам нужно записывать имена тегов?).

...