PHP中的单词音节

时间:2019-04-28 12:38:58

标签: php string

伙计们,我是PHP新手,请帮助!谢谢。 可以说我需要对一些而不是典型的单词进行音节处理: text =“ abce dfia jicd fbii”。 条件是:如果我们在文本中有两个彼此接近的辅音,例如“ bc”,“ df”,“ cd”或“ fb”,则需要用插入符“-”将它们分开。 因此输出必须为:“ ab-ce d-fia jic-d f-bii”。 我的输出是:“ abcei-idfiai-ijicdi-ifbii”。我做错了什么?请帮忙!

$text= "abce dfia jicd fbii";
$letters_1= array("a","e","i","j");
$letters_2= array("b","c","d","f");
$insert= "-";

    for ($x=0; $x<strlen($text); $x++) {
        foreach($letters_2 as $letter => $value) {
            if ($letter==$text[$x] and $value==$value) {
                $new_text= str_replace(" ", $text[$x].$insert.$text[$x], $text);
            }
        }
    }
echo $new_text;

我希望输出:“ ab-ce d-fia jic-d f-bii”

2 个答案:

答案 0 :(得分:1)

一种实现此目的的方法是使用preg_replace用两个字母之间用-替换两个辅音的序列。

$text= "abce dfia jicd fbii";
$consonants = array_diff(range('a', 'z'), array('a', 'e', 'i', 'o', 'u'));
$cset = '[' . implode('', $consonants) . ']';
echo preg_replace("/($cset)($cset)/", '$1-$2', $text);

输出:

ab-ce d-fia jic-d f-bii

请注意,此代码仅适用于最多2个辅音的序列,您可能需要连续两次调用preg_replace连续3个或更多。例如:

$text = 'abcce ibddfa';
$text = preg_replace("/($cset)($cset)/", '$1-$2', $text);
echo preg_replace("/($cset)($cset)/", '$1-$2', $text);

输出:

ab-c-ce ib-d-d-fa

Demo on 3v4l.org

答案 1 :(得分:0)

为此,我将使用正则表达式。据我所知,“仅辅音”没有简写形式,因此我们需要自己构建该表达式。查看完整的a-z范围(不包括元音),并尽可能使用范围,这使我们b-df-hj-np-t和{{1} }作为辅音范围(如果要将v-z视为元音,请使用yv-x而不是z)。

所以这样的事情应该起作用(可以使用更短或更有效的表达方式来做到这一点):

v-z