Как preg_replace_all в большом количестве данных

Я просто делаю скрипт обновления для замены всех тегов фрагмента MODX на новый формат:

Старый: [~123~]

Новый: [[~123]]

(конечно, 123 — это пример — много разных чисел)

Также я хотел заменить все кастомные старый фрагменты для более новых:

Старый фрагмент кода:

[!MySnippetName? &param1=`value1` &param2=`value2` !]

Новый:

[[!MySnippetName? &param1=`value1` &param2=`value2` ]]

(конечно, &param1=value1 &param2=value2 это просто пример, и он отличается от реальных фрагментов)

Как использовать функцию preg_replace для глобальных замен?
Я должен создать так:

$doc[ 'content' ] = $this->preg_replace_all(
array(
'/\[~([0-9]+)~\]/',
'\[!LatestUpdates(.*)!\]',
'\[!ArticleSummary(.*)!\]',
), array(
'[[~\1]]',
'[[!LatestUpdates\1]]',
'[[!ArticleSummary\1]]',
),
$doc[ 'content' ]
);

preg_replace_all функция:

private function preg_replace_all( $find, $replacement, $s )
{
while(preg_match($find, $s)) {
$s = preg_replace($find, $replacement, $s);
}
return $s;
}

Но это не работает. Пожалуйста, помогите разобраться в проблеме. Заранее спасибо.

3

Решение

preg_replace Функция уже выполняет глобальную замену, и поскольку заменяются только совпадающие подстроки, вам не нужно проверять существование этих подстрок с помощью preg_match,

Вы можете уменьшить три шаблона только до одного шаблона:

$pattern = '/\[(?|(!LatestUpdates|!ArticleSummary)(.*?)!]|(~)([0-9]+)~])/';
$replacement = '[[$1$2]]';
$doc['content'] = preg_replace($pattern, $replacement, $doc['content']);

Этот шаблон использовать сброс ветки функция, которая позволяет группам захвата иметь одинаковый номер в каждой альтернативе.

Если это возможно (если он не меняет теги, которые вы хотите сохранить), вы можете сделать то же самое с strtr:

$doc['content'] = strtr($doc['content'], array('[!'=>'[[!', '[~'=>'[[~', '~]'=>']]', '!]'=>']]'));

Обратите внимание, что если вы можете использовать его, не стесняйтесь, так как этот путь намного быстрее.

5

Другие решения

Почему вы используете PHP для этого — вы написали плагин для преобразования всех тегов Evolution в формат Revolution при каждом анализе страницы?

Если это так, это неэффективно, и было бы лучше заменить все теги в базе данных, где хранятся контент, шаблоны, блоки и т. Д.

Вы можете легко это сделать, используя такой запрос:

UPDATE modx_site_content SET content = REPLACE(content, '[!', '[[!');

Вы должны повторить это для всех других тегов открытия и закрытия, а также для других таблиц базы данных.

Сделайте резервную копию вашей базы данных, прежде чем пытаться это …

1

По вопросам рекламы [email protected]