artloveyou
@artloveyou

Как правильно определить позицию символа при substr_replace?

Есть строка (HTML). Нахожу в ней все плейсхолдеры и их позиции. Затем вставляю в исходную строку подстроки по позициям. И почему-то первая позиция отрабатывает нормально, а остальные сбиваются. Надо имено так, чтобы в процессе ещё каждую подстроку обработать. str_replace($placeholder, $replacer, $content), который заменит все вхождения на одно и то же значение не нужен.

Песочница с кодом

Делаю:
<?php
$content = '
<p>text</p>
<p>text</p>
<p>{PLACEHOLDER}</p>
<p>text</p>
<p>text</p>
<p>{PLACEHOLDER}</p>'
;

$placeholder = '{PLACEHOLDER}';
$replacer = '<div>INSERT</div>';


preg_match_all('/' . $placeholder . '/mi', $content, $matches, PREG_OFFSET_CAPTURE);

$result = [];
  if (count($matches[0]) > 0) {
     foreach($matches[0] as $match){
       $result[$match[1]] = $match[0];
    }
}

foreach ($result as $pos => $placeholder) {
  $content = substr_replace($content, $replacer, $pos, strlen($placeholder));
}

var_dump($result);
var_dump($content);


Получаю:
array(2) {
[28]=>
string(13) "{PLACEHOLDER}"
[73]=>
string(13) "{PLACEHOLDER}"
}
string(98) "
text


text


INSERT

text


text

INSERT
DER}
"
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Когда вы меняете подстроку на подстроку другой длины, все найденные правее позиции сдвигаются. Так что менять надо начиная с последней позиции.

А вообще, такое делается гораздо проще через str_replace, возможно с массивами, или, в сложных случаях, через preg_replace/preg_replace_callback.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
'/' . $placeholder . '/miu'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы