0
$value = "abrak'adabra' baba";

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

$pattern[] = '/(\'[^\']+\')|(a)/e';
$replacement = "strlen('\\2') ? 'i' : '\\0'";

上面的代码将abrak'adabra' baba更改为ibrik'adabra' bibi

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

老实说,我什至不太了解上面的正则表达式模式。有一些我知道但我不知道的代码:

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

我会很感激任何帮助。这个正则表达式的东西让我很沮丧:(

4

1 回答 1

0

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

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

// 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);

如果您所做的只是在引号之间替换ai则可能有更优化的方法来解决它,但这样您就有空间对引号之间的字符串进行更高级的处理。

于 2012-11-22T00:23:35.620 回答