gpt4 book ai didi

php - 如何在大量数据中preg_replace_all

转载 作者:可可西里 更新时间:2023-11-01 00:32:03 32 4
gpt4 key购买 nike

我只是制作了一个升级脚本,用于将所有 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('[!'=>'[[!', '[~'=>'[[~', '~]'=>']]', '!]'=>']]'));

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

关于php - 如何在大量数据中preg_replace_all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702309/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com