【问题标题】:preg_replace: add number after backreferencepreg_replace:在反向引用后添加数字
【发布时间】:2013-08-04 08:50:44
【问题描述】:

情况

我想使用preg_replace() 在每个[aeiou] 之后添加一个数字'8'

示例

来自

abcdefghij

a8bcde8fghi8j


问题

我应该如何写替换字符串?

// input string
$in = 'abcdefghij';

// this obviously won't work ----------↓
$out = preg_replace( '/([aeiou])/', '\18',  $in);

只是一个例子,因此建议str_replace() 不是一个有效的答案。
我想知道如何在替换字符串中反向引用后有数字。

【问题讨论】:

    标签: php regex escaping backreference


    【解决方案1】:

    解决方案是将反向引用包装在${}中。

    $out = preg_replace( '/([aeiou])/', '${1}8',  $in);
    

    这将输出 a8bcde8fghi8j

    请参阅 the manual 了解这种带有反向引用的特殊情况。

    【讨论】:

    • 谢谢;我应该在下次问之前 RTFM。
    • 好的。只要保证不放弃提出有效的问题(比如这个)。我们通过提问来学习,而这一次,我猜你得到答案的速度比试错法快 10 倍。一定有人知道解决方案... ;)
    • 其实发完之后我去php.net,找到了答案。当您免去我自己回答的耻辱时,我已经在写自己的答案了;)
    • 注意单引号。 "${1}8" 不起作用,因为双引号字符串在 php 中被解析/解释,因此大括号“消失”在字符串传递给函数之前消失。
    【解决方案2】:

    你可以这样做:

    $out = preg_replace('/([aeiou])/', '${1}' . '8', $in);
    

    Here is a relevant quote from the docs regarding backreference:

    当使用一个替换模式时,一个反向引用紧跟另一个数字(即:在匹配的模式之后立即放置一个文字数字),您不能使用熟悉的 \1 符号作为反向引用。例如,\11 会混淆 preg_replace(),因为它不知道您是想要 \1 反向引用后跟文字 1,还是希望 \11 反向引用后跟什么都没有。在这种情况下,解决方案是使用 \${1}1。这会创建一个孤立的 $1 反向引用,将 1 保留为文字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多