代码之家  ›  专栏  ›  技术社区  ›  Mayko

PHP preg\u替换多个规则

  •  2
  • Mayko  · 技术社区  · 15 年前

    我只是想知道如何为preg\u replace应用几个规则而不在第一次运行时执行它们。有点复杂,让我举个例子来解释。

    输入:

    $string = 'The quick brown fox jumps over the lazy freaky dog'; 
    

    规则:

    • 替换 , o 具有 u
    • e u (如果不是在单词的开头&如果不是在元音之前/之后)
    • ea公司 具有 (如果不是在单词的开头)
    • 替换全字ie 具有

    输出: 那只小黑狼在那只毛茸茸的猫身上蹦蹦跳跳




    编辑感谢以西结门 )

    $patterns = array();
    $replacements = array();
    
    $patterns[] = "/(?<!\b|[aeiou])[aio](?![aeiou])/";
    $replacements[] = "u";
    
    $patterns[] = "/(?<!\b|[aeiou])[eu](?![aeiou])/";
    $replacements[] = "i";
    
    $patterns[] = '/ea/';
    $replacements[1] = 'i';
    
    $patterns[] = '/dog/';
    $replacements[0] = 'cat';
    
    echo preg_replace($patterns, $replacements, $string);
    

    输出:

    Thi qiick briwn fix jimps ivir thi lizy friiky dig
    



    编辑时间:

    正如你所看到的问题是 每个规则都会被前一个规则覆盖

    '示例' ':

    1. 规则:转弯 狐狸 福克斯
    2. 福克斯 修理

    如果角色已经受到上一个规则的影响,有没有办法避免以下规则?

    1 回复  |  直到 13 年前
        1
  •  3
  •   Ezequiel Muns    15 年前

    首先,你需要明确的替换条件,你的规则说'不是在一个词的开头,也不是在一个元音之前/之后',但你没有在正则表达式中实现这一点。您可以使用负的Lookahead/lookback来实现这一点。例如:

    可通过以下方式实现:

    $patterns[] = "/(?<!\b|[aeiou])[aio](?![aeiou])/";
    $replacements[] = "u";
    

    此方法可用于实现前3个规则。

    下一个问题是“fox”和“dog”将受前3条规则的影响,因此您应该替换 改变 “狼”和“猫”的版本。所以对于狗来说=>类别:

    $patterns[] = "/\bdug\b/";
    $replacements[] = "cat";
    

    第2部分:

    啊哈。我懂了。你需要把替代品排除在外。

    您可以使用一个正则表达式来匹配前两种情况,这两种情况都是有问题的。然后您可以使用preg\u replace的一个有趣而奇怪的特性:当您添加 e 修饰符时,替换字符串将改为PHP代码。将其与捕获组相结合,可以让您决定是否输出 u 或者一个 i

    $patterns[] = "/(?<!\b|[aeiou])([aeiou])(?![aeiou])/e";
    $replacements[] = '("$1" == "e" || "$1" == "u")? "i":"u"';