压缩函数从字符串中删除双字母(PHP)

时间:2012-05-14 11:12:18

标签: php function

我需要从一个单词中取出每个双字母。 ( I.E。“附加”必须成为:“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 是包含任何第一个双字母位置的数组。

它完美有效,但真正的程序员如何以更浓缩的方式编写相同的功能?我觉得有可能在没有三个循环和如此多代码的情况下做同样的事情。

2 个答案:

答案 0 :(得分:0)

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

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

应该有效。它告诉正则表达式匹配a-z中的一个字符,然后是匹配本身,因此实际上是两个相同的字符。 @标记正则表达式的开始和结束。如果你想要更多的字符而不仅仅是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/

答案 1 :(得分: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;