#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, исправлено. В любом случае лучше не использовать встроенные переменные.