Я просто делаю скрипт обновления для замены всех тегов фрагмента MODX на новый формат:
Старый: [~123~]
Новый: [[~123]]
(конечно, 123 — это пример — много разных чисел)
Также я хотел заменить все кастомные старый фрагменты для более новых:
Старый фрагмент кода:
[!MySnippetName? ¶m1=`value1` ¶m2=`value2` !]
Новый:
[[!MySnippetName? ¶m1=`value1` ¶m2=`value2` ]]
(конечно, ¶m1=value1 ¶m2=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;
}
Но это не работает. Пожалуйста, помогите разобраться в проблеме. Заранее спасибо.
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('[!'=>'[[!', '[~'=>'[[~', '~]'=>']]', '!]'=>']]'));
Обратите внимание, что если вы можете использовать его, не стесняйтесь, так как этот путь намного быстрее.
Почему вы используете PHP для этого — вы написали плагин для преобразования всех тегов Evolution в формат Revolution при каждом анализе страницы?
Если это так, это неэффективно, и было бы лучше заменить все теги в базе данных, где хранятся контент, шаблоны, блоки и т. Д.
Вы можете легко это сделать, используя такой запрос:
UPDATE modx_site_content SET content = REPLACE(content, '[!', '[[!');
Вы должны повторить это для всех других тегов открытия и закрытия, а также для других таблиц базы данных.
Сделайте резервную копию вашей базы данных, прежде чем пытаться это …