我需要从一个单词中取出每个双字母。 ( 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 是包含任何第一个双字母位置的数组。
它完美有效,但真正的程序员如何以更浓缩的方式编写相同的功能?我觉得有可能在没有三个循环和如此多代码的情况下做同样的事情。
答案 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.php和http://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;