0

我需要从单词中删除每个出现的双字母。(IE“attached”必须变成:“aached”。

我写了这个函数:

function strip_doubles($string, $positions) {
for ($i = 0; $i < strlen($string); $i++) {
    $stripped_word[] = $string[$i];
}   
foreach($positions['word'] as $position) {      
    unset($stripped_word[$position], $stripped_word[$position + 1]);
}
$returned_string= "";   
foreach($stripped_words $key => $value) {
    $returned_string.= $stripped_words[$key];
}
return $returned_string;
}

其中$string是要删除的单词,$positions是一个包含任何第一个双字母位置的数组。

它完美地工作,但真正的程序员如何以更简洁的方式编写相同的函数?我有一种感觉,不用三个循环和这么多代码也可以做同样的事情。

4

2 回答 2

0

您应该使用正则表达式。它匹配某些特征,并且可以用其他一些字符串替换匹配的出现。

就像是

$result = preg_replace('@([a-zA-Z]{1})\1@i', '', $string);

应该管用。它告诉正则表达式匹配 az 中的一个字符,然后匹配匹配本身,因此实际上是两个相同的字符。@ 标记正则表达式的开始和结束。如果您需要更多字符而不仅仅是 az 和 AZ,您可以使用其他标识符,例如 [a-ZA-Z0-9]{1} 或任何字符 .{1} 或仅 Unicode 字符(包括组合字符),请使用 \ p{L}\p{M}*

最后一个 @ 之后的 i 标志表示“不区分大小写”,并将指示正则表达式也匹配具有不同大小写的组合,例如“tT”。如果您只想要相同情况下的组合,例如“tt”和“TT”,则从标志中删除“i”。

'' 告诉正则表达式用空字符串替换匹配的出现(两个相同的字符)。

请参阅http://php.net/manual/en/function.preg-replace.phphttp://www.regular-expressions.info/

于 2012-05-14T11:19:29.100 回答
0

非正则表达式解决方案,经过测试:

$string = 'attached';
$stripped = '';
for ($i=0,$l=strlen($string);$i<$l;$i++) {
    $matched = '';
    // if current char is the same as the next, skip it
    while (substr($string, $i, 1)==substr($string, $i+1, 1)) {
        $matched = substr($string, $i, 1);
        $i++;
    }
    // if current char is NOT the same as the matched char, append it
    if (substr($string, $i, 1) != $matched) {
        $stripped .= substr($string, $i, 1);
    }
}
echo $stripped;
于 2012-05-14T11:24:31.300 回答