0

単語から2文字の出現をすべて取り除く必要があります。(IE「添付」は「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文字の位置を含む配列です。

それは完全に機能しますが、実際のプログラマーはどのようにして同じ関数をより凝縮された方法で書くのでしょうか?3つのループと多くのコードがなくても同じことができるのではないかと感じています。

4

2 に答える 2

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 に答える
0

正規表現を使用する必要があります。特定の特性に一致し、一致した出現箇所を他の文字列に置き換えることができます。

何かのようなもの

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

動作するはずです。az からの 1 文字とそれに続く一致自体に一致するように正規表現に指示します。したがって、実質的に 2 つの同一文字が連続します。@ は、正規表現の開始と終了を示します。az と AZ 以外の文字が必要な場合は、[a-ZA-Z0-9]{1} などの他の識別子を使用するか、任意の文字 .{1} を使用するか、Unicode 文字 (結合文字を含む) のみを使用して \ を使用できます。 p{L}\p{M}*

最後の @ の後の i フラグは、「大文字と小文字を区別しない」ことを意味し、「tT」のように大文字と小文字が異なる組み合わせも照合するように正規表現に指示します。'tt' と 'TT' のように大文字と小文字の組み合わせのみが必要な場合は、フラグから 'i' を削除します。

'' は、一致した出現 (2 つの同一の文字) を空の文字列に置き換えるように正規表現に指示します。

http://php.net/manual/en/function.preg-replace.phpおよびhttp://www.regular-expressions.info/を参照してください。

于 2012-05-14T11:19:29.100 に答える