【问题标题】:Regex preg_match change only special character between quote正则表达式 preg_match 仅更改引号之间的特殊字符
【发布时间】:2012-11-21 23:42:45
【问题描述】:
$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 是什么意思)

我将不胜感激。这个正则表达式的东西让我很沮丧:(

【问题讨论】:

  • \\0 是整个匹配项。它只会重新插入正则表达式找到的原始单词。

标签: php regex preg-replace


【解决方案1】:

在模式中使用 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,则可能有更优化的方法来处理它,但这样您就有空间对引号之间的字符串进行更高级的处理。

【讨论】:

  • 天啊,我真的忘记了我是否可以使用 preg_replace_callback。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 2016-04-18
  • 2023-03-17
  • 2017-07-16
  • 1970-01-01
  • 2023-04-10
  • 2017-02-16
  • 2017-11-20
相关资源
最近更新 更多