Php Regex preg_match仅在引号之间更改特殊字符

Php Regex preg_match仅在引号之间更改特殊字符,php,regex,preg-replace,Php,Regex,Preg Replace,上述代码将abrak'adabra'baba更改为Abrik'adabra'bibi 我想做的是将abrak'adabra'baba更改为abrak'Idbri'baba。怎么做 老实说,我甚至不太理解上面的正则表达式模式。 关于代码,我知道但不知道: 在$pattern中,说:(任何包含两个引号且中间没有引号的单词)或(字符“a”)。在替换中,php代码(如strlen)将起作用,因为将使用/e修饰符。但我不明白为什么这是一个“或”的逻辑 如果模式中第二部分(a字符)的长度大于零,请将其替换

上述代码将abrak'adabra'baba更改为Abrik'adabra'bibi

我想做的是将abrak'adabra'baba更改为abrak'Idbri'baba。怎么做

老实说,我甚至不太理解上面的正则表达式模式。 关于代码,我知道但不知道:

  • 在$pattern中,说:(任何包含两个引号且中间没有引号的单词)或(字符“a”)。在替换中,php代码(如strlen)将起作用,因为将使用/e修饰符。但我不明白为什么这是一个“或”的逻辑
  • 如果模式中第二部分(a字符)的长度大于零,请将其替换为“i”,否则请执行其他操作(我不理解\0的含义)

我将感谢任何帮助。这个正则表达式的东西告诉我:(

在模式中使用
e
修饰符(eval)是危险的,因为有人可能会在您的服务器上执行恶意代码(有关更多信息,请参阅该部分)

相反,如果您需要对匹配的项目进行额外处理,您可以使用:


如果您所做的只是在引号之间用
i
替换
a
,可能会有更好的方法,但这样您就有空间对引号之间的字符串进行更高级的处理。

\\0
就是全部匹配。它只需重新插入原始单词regex found.OMG,我真的忘了如果我可以使用preg\u replace\u回调。非常感谢:)
$value = "abrak'adabra' baba";

$pattern = array();
$replacement = array();

$pattern[] = '/(\'[^\']+\')|(a)/e';
$replacement = "strlen('\\2') ? 'i' : '\\0'";
// Find all characters between single quotes
$result = preg_replace_callback('/\'(.*?)\'/', function($matches){
    // Replace 'a' with 'i' in found matches
    return '\''.str_replace('a', 'i', $matches[1]).'\'';
}, $value);