带有重叠参数的preg_replace

时间:2013-10-28 18:30:33

标签: php regex

我试图修正一个用连字符分隔元音和后缀的脚本。

<?php
$string = 'celebrationing';
$patterns = array();
$patterns[0] = '/a/';
$patterns[1] = '/e/';
$patterns[2] = '/i/';
$patterns[3] = '/o/';
$patterns[4] = '/u/';
$patterns[5] = '/tion/';

$replacements = array();
$replacements[0] = '-a';
$replacements[1] = '-e';
$replacements[2] = '-i';
$replacements[3] = '-o';
$replacements[4] = '-u';
$replacements[5] = '-tion';

echo preg_replace($patterns, $replacements, $string);


?>

该脚本适用于元音,但是当我进入后缀时,它不会打印连字符。

输出: C-EL-EBR-AT-1-上-ING

我认为-i和-o都是元音的事实是什么让整个过程变得混乱。

如何识别所有六种模式,所有实例都超过-i和-o?

2 个答案:

答案 0 :(得分:6)

您可以使用更简单的正则表达式:

preg_replace('/tion|[aeiou]/', "-$0", $string);

regex101 demo

正则表达式首先尝试匹配tion,从而阻止同一匹配中io的匹配。

答案 1 :(得分:2)

不像Jerry的解决方案那么优雅,这个使用了负面的前瞻和解决方案。回顾后:

<?php

$string = 'celebrationing';
$patterns = array();
$patterns[0] = '/a/';
$patterns[1] = '/e/';
$patterns[2] = '/i(?!on)/';
$patterns[3] = '/o(?<!ti)(?!n)/';
$patterns[4] = '/u/';
$patterns[5] = '/tion/';

$replacements = array();
$replacements[0] = '-a';
$replacements[1] = '-e';
$replacements[2] = '-i';
$replacements[3] = '-o';
$replacements[4] = '-u';
$replacements[5] = '-tion';

echo preg_replace($patterns, $replacements, $string);

<强> OUPUT:

c-el-ebr-a-tion-ing