替换模式内的所有匹配项

Posted

技术标签:

【中文标题】替换模式内的所有匹配项【英文标题】:Replace all occurrences inside pattern 【发布时间】:2012-05-18 10:17:12 【问题描述】:

我有一个这样的字符串

 some text @ other text @ and some other text  @ this should not be replaced  but this should: @ 

我希望它变成

 some text ### other text ### and some other text  @ this should not be replaced  but this should: ### 

我想这个例子很简单,我不确定我能否更好地用文字解释我想要实现的目标。

我尝试了几种不同的方法,但都没有奏效。

【问题讨论】:

【参考方案1】:

这可以通过一个正则表达式回调一个简单的字符串替换来实现:

function replaceInsideBraces($match) 
    return str_replace('@', '###', $match[0]);


$input = ' some text @ other text @ and some other text  @ this should not be replaced  but this should: @ ';
$output = preg_replace_callback('/.+?/', 'replaceInsideBraces', $input);
var_dump($output);

我选择了一个简单的非贪婪正则表达式来查找您的大括号,但您可以选择更改它以提高性能或满足您的需要。

匿名函数可以让你参数化你的替换:

$find = '@';
$replace = '###';
$output = preg_replace_callback(
    '/.+?/',
    function($match) use ($find, $replace) 
        return str_replace($find, $replace, $match[0]);
    ,
    $input
);

文档:http://php.net/manual/en/function.preg-replace-callback.php

【讨论】:

【参考方案2】:

您可以使用 2 个正则表达式来做到这一点。第一个选择 之间的所有文本,第二个将@ 替换为###。可以像这样使用 2 个正则表达式:

$str = preg_replace_callback('/first regex/', function($match) 
    return preg_replace('/second regex/', '###', $match[1]);
);

现在您可以制作第一个和第二个正则表达式,自己尝试一下,如果您不明白,请在这个问题中提问。

【讨论】:

在 preg_replace_callback 中的 preg_replace 会因为两次找到一个字符串而影响性能?【参考方案3】:

另一种方法是使用正则表达式(\\[^]+?)@([^]+?\\)。您需要运行几次才能匹配多个@s 内的 大括号

<?php

$string = ' some text @ other text @ and some other text  @ this should not be replaced  but this should: @ ';
$replacement = '#';
$pattern = '/(\\[^]+?)@([^]+?\\)/';

while (preg_match($pattern, $string)) 
    $string = preg_replace($pattern, "$1$replacement$2", $string);


echo $string;

哪些输出:

some text ### other text ### and some other text @ 这应该 不会被替换 但这应该是:###

【讨论】:

以上是关于替换模式内的所有匹配项的主要内容,如果未能解决你的问题,请参考以下文章

C# 正则表达式 - 为括号内的单个模式查找一个或多个匹配项

如何在 Visual Studio Code 中查找和替换所有匹配项(在所有文件中)?

JavaScript正则表达式-替换所有匹配项?

C ++正则表达式替换第一个匹配项

如何在 PHP 中替换字符串中一个数字加上一个带逗号的空格的所有匹配项

thymeleaf 中 String 对象的 #strings.replace() 实用程序方法是不是替换了提供的字符串中的所有匹配项?