php preg_replace ничего не делает

#php #preg-replace

#php #preg-replace

Вопрос:

По какой-то причине мой вызов preg_replace не работает, я проверил все, что мог придумать, но безрезультатно. Есть предложения?

 foreach ($this->vars as $key=>$var)
{
    preg_replace("/{$key}/", $var, $this->tempContentXML);
}
  

vars — это массив, содержащий $key->значение, которое необходимо заменить в строке, tempContentXML — это строка, содержащая XML-данные.

Фрагмент строки

 ...<table:table-cell table:style-name="Table3.B1" office:value-type="string"><text:p text:style-name="P9">{Reference}</text:p></table:table-cell></table:table-row><table:table-row table:style-name="Table3.1"><...
  

ПРИМЕР.

 $this->vars['Reference'] = Test;
foreach ($this->vars as $key=>$var)
{
    preg_replace("/{$key}/", $var, $this->tempContentXML);
}
  

Это должно заменить строку {Reference} значением в массиве в $key

Но это не работает.

Комментарии:

1. Этот цикл очень неэффективен. Используйте preg_replace_callback и поиск по массиву.

Ответ №1:

Замена не происходит на месте (возвращается новая строка).

 foreach ($this->vars as $key=>$var) {
    $this->tempContentXML = preg_replace("/{$key}/", $var, $this->tempContentXML);
}
  

Кроме того, никогда не используйте регулярное выражение для простой замены строк (при $this->vars условии, что оно не содержит регулярных выражений):

 foreach ($this->vars as $key=>$var) {
    $this->tempContentXML = str_replace('{'.$key.'}', $var, $this->tempContentXML);
}
  

Комментарии:

1. Вам нужно будет экранировать второй пример { и } потому, что они окружают интерполированную переменную?

2. Ty, исправлено. В любом случае лучше не использовать встроенные переменные.