我只是制作了一个升级脚本,用于将所有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;
}
但它不起作用。请帮助找出问题所在。提前谢谢。
答案 0 :(得分:5)
preg_replace
函数已执行全局替换,并且由于仅替换匹配的子字符串,因此您无需使用preg_match
测试这些子字符串的存在。
您可以将三种模式缩减为仅一种模式:
$pattern = '/\[(?|(!LatestUpdates|!ArticleSummary)(.*?)!]|(~)([0-9]+)~])/';
$replacement = '[[$1$2]]';
$doc['content'] = preg_replace($pattern, $replacement, $doc['content']);
此模式使用branch reset功能,允许捕获组在每个替代中具有相同的编号。
如果可能(如果它不更改您要保留的标签),您可以对strtr
执行相同操作:
$doc['content'] = strtr($doc['content'], array('[!'=>'[[!', '[~'=>'[[~', '~]'=>']]', '!]'=>']]'));
请注意,如果您可以使用它,请不要犹豫,因为这种方式要快得多。
答案 1 :(得分:1)
为什么使用PHP来执行此操作 - 您是否编写了一个插件,以便在解析页面时将所有Evolution标记转换为Revolution格式?
如果是这种情况,这样效率很低,最好替换数据库中存储内容,模板,块等的所有标签。
您可以使用以下查询轻松完成此操作:
UPDATE modx_site_content SET content = REPLACE(content, '[!', '[[!');
您将对所有其他打开和关闭标记以及其他数据库表重复此操作。
在尝试此操作之前备份您的数据库...