php – 如何在大量数据中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;
}

但它不起作用.请帮助找出问题所在.提前致谢.

解决方法:

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('[!'=>'[[!', '[~'=>'[[~', '~]'=>']]', '!]'=>']]'));

请注意,如果您可以使用它,请不要犹豫,因为这种方式要快得多.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...