【问题标题】:Nesting preg_replace functions while escaping tokens在转义标记时嵌套 preg_replace 函数
【发布时间】:2010-08-31 21:38:02
【问题描述】:

我在 preg_replace 中使用 'e' 修饰符来搜索给定的字符串。然后我需要它使用另一个 preg_replace 语句在该字符串中查找单个匹配项:

$str = "This is FOO.";
$str = preg_replace('/(foo)/ie', "x$1", $str);
echo $str;

这将生成:This is xFOO.
现在我需要筑巢。 (我之所以嵌套是因为我需要将未知数量的组匹配到单独的标记中,这对于本论坛其他地方讨论的单个 preg_replace 语句是不可能的。我显然已经简化了这段代码以专注于我的问题)。

$str = "This is FOO.";
$str = preg_replace('/(foo)/ie', "preg_replace('/(\w)/i','x$1','$1')", $str);
echo $str;

我需要这个来生成This is xFxOxO.
但它会生成This is xFOOxFOOxFOO.

当 php 计算第二行代码时,它会将两个 $1 标记替换为匹配的字符串 foo。我需要它忽略第一个 $1 令牌,因为它应该由内部 preg_replace 语句评估。如何转义第一个 $1 令牌,使其不会被外部 preg_replace 语句评估?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    你可以用类似的东西欺骗解析器

    $str = preg_replace('/(foo)/ie', "preg_replace('/(\w)/i','x$'.'1','$1')", $str);
    

    但是,老实说,它看起来非常丑陋。你可能想告诉我们更多关于这个问题的信息,我相信有更好的方法。

    【讨论】:

    • 是的,效果很好。只需添加 '.' 就足以延迟对该令牌的评估。谢谢你。为了回答您的问题,我使用它来将文本文件标记为 xml。我用 标签识别一整行,然后用 标签识别其中的元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多