Замена значений в укусе массивом других значений - PullRequest
0 голосов
/ 16 июня 2019

Я хочу заменить все src атрибуты img тегов в строке.

Моя строка:

$string = "some text with <img src='/uploads/images/5d0554.jpeg'> and 
<img src='/uploads/images/507a.jpeg'> or <img src='/uploads/images/0a74.jpeg'> in it.";

должна стать:

$string = "some text with <img src='some/value/one.jpeg'> and 
<img src='alue/SomethingElse.png'> or <img src='Value3'> in it.";

Что я пытался сделать:

$regex = '/< *img[^>]*src *= *["\']?([^"\']*)/i';

preg_match_all($regex, $string, $matches);
$srcMatches = $matches[1];

$replacementValues = ["some/value/one.jpeg", "value/SomethingElse.png", "Value3"];

preg_replace_callback($regex, function($matches) use (&$replacementValues) {
    return array_shift($replacementValues);
}, $string);

Это дает мне

some long text with some/value/one.jpeg'> and 
value/SomethingElse.png'> or Value3'> in it.

Я также пытался с preg_replace, но это вызвало у меня проблемы из-за всех / в значениях, которые нужно заменить.

1 Ответ

0 голосов
/ 16 июня 2019

Это выражение, скорее всего, выполнит замены, используя 6 групп захвата:

$re = '/([\s\S]*?)(src=[\'"])\/uploads\/images\/.+?(\..+?)([\'"]>[\s\S]*?src=[\'"])\/uploads\/images\/.+?\..+?([\'"]>[\s\S]*?src=[\'"])\/uploads\/images\/.+?\..+?([\'"]>[\s\S]*)/m';
$str = 'some text with <img src=\'/uploads/images/5d0554.jpeg\'> and 
<img src=\'/uploads/images/507a.jpeg\'> or <img src=\'/uploads/images/0a74.jpeg\'> in it.';
$subst = '$1$2some/value/one$3$4alue/SomethingElse\\.png$5Value3$6';

$result = preg_replace($re, $subst, $str);

echo $result;

выход

some text with <img src='some/value/one.jpeg'> and 
<img src='alue/SomethingElse.png'> or <img src='Value3'> in it.

Демо

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...