2

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

<?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);


?>

该脚本适用于元音,但当我谈到后缀 -tion 时,它不会打印连字符。

输出:c-el-ebr-at-i-on-ing

我想的是,-i 和 -o 都是元音,这让整个过程变得混乱。

我如何允许识别所有六种模式,所有 -tion 实例都取代 -i 和 -o?

4

2 回答 2

6

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

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

正则表达式101演示

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

于 2013-10-28T18:34:32.527 回答
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);

输出:

c-el-ebr-a-tion-ing
于 2013-10-28T18:41:24.217 回答