我只是制作了一个升级脚本,用于将所有MODX片段标签替换为更新的格式:
老一:[~123~]
新的:[[~123]]
(当然,123 – 这是一个例子 – 有很多不同的数字)
此外,我想将所有自定义旧片段替换为较新的片段:
旧片段格式:
[!MySnippetName? ¶m1=`value1` ¶m2=`value2` !]
新的一个:
[[!MySnippetName? ¶m1=`value1` ¶m2=`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;
}
但它不起作用.请帮助找出问题所在.提前致谢.
解决方法:
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('[!'=>'[[!', '[~'=>'[[~', '~]'=>']]', '!]'=>']]'));
请注意,如果您可以使用它,请不要犹豫,因为这种方式要快得多.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。