正则表达式preg_match只改变引号之间的特殊字符

时间:2012-11-21 23:42:45

标签: php regex preg-replace

$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”)。在替换中,php代码这样的strlen将起作用,因为将使用/ e修饰符。但我无法理解为什么它在那里是“或”逻辑。
  • 如果模式中第二部分的长度(一个字符)大于零,则将其替换为“i”,否则执行其他操作(我不明白\ 0意味着什么)

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

1 个答案:

答案 0 :(得分:0)

在模式中使用e修饰符(eval)是危险的,因为有人可能会在您的服务器上执行恶意代码(有关详情,请参阅the manual's部分)。

相反,如果您需要对匹配的项目进行额外处理,则可以使用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);

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