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

从字符串中去除双字母的压缩函数(PHP),php,function,Php,Function,我需要把单词中出现的每一个双字母去掉。也就是说,连接必须变成:aached 我写了这个函数: function strip_doubles($string, $positions) { for ($i = 0; $i < strlen($string); $i++) { $stripped_word[] = $string[$i]; } foreach($positions['word'] as $position) { unset($stripped_w

我需要把单词中出现的每一个双字母去掉。也就是说,连接必须变成: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是包含任何第一个双字母位置的数组


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

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

差不多

$result = preg_replace('@([a-zA-Z]{1})\1@i', '', $string);
应该有用。它告诉regexp匹配a-z中的一个字符,后跟匹配本身,因此实际上是两个完全相同的字符。@标记regexp的开始和结束。如果您想要更多的字符,而不仅仅是a-z和a-z,您可以使用其他标识符,如[a-ZA-Z0-9]{1}或用于任何字符。{1}或仅用于包括组合字符的Unicode字符,请使用\p{L}\p{M}*

最后一个@后面的i标志表示“不区分大小写”,并将指示regexp也匹配不同大小写的组合,如“tT”。如果您只希望在相同的情况下使用组合,那么使用'tt'和'tt',然后从标志中删除'i'

通知regexp用空字符串替换匹配的两个相同字符


请参阅和

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

$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;

然后删除regexp末尾的i标志。因此,让它成为@[a-zA-Z]{1}\1@gI我知道,这只是为了说明一下。正确的用法应该是\p{L}\p{M}*与您的\p{L}相比,但这只是一些细节。没有必要投反对票,我们都在尽力帮助他。因为主题发起者不知道正则表达式,所以这是一个简单的例子,乍一看并不会吓跑他。此外,它适用于最常见的情况。你仍然是对的,添加更多的信息不会有什么坏处。谢谢:@Radu这是真的,你必须检查这个角色是否是一封信。