2012-05-11 8 views
2

は、あなたが次の文字列があるとします。Hello... how are you!!?? I'm bored!!PHP - 重複する句読点を削除しますか?

私は可能な限り削除するバックツーバックの句読点たいが、と疑問符のために似たような状況が発生した場合に保持されるように「!?」。次のようにフィルタ文字列が表示されます:

Hello. how are you? I'm bored!

ベストの答えは、この問題を解決し、最も簡潔なソリューションになります。私は正規表現がこれを解決する最善の方法だと思っていますが、正規表現の知識は非常に限られており、解決方法についてはわかりません。私は、しかし、正規表現以外のソリューションで大丈夫です!あなたが提供するコードについての説明は、悪意を持って単純なものでなければ、いいと思います。

ありがとうございました!

答えて

3
$str = preg_replace('~[?!]{2,}~', '?', preg_replace('~([.,!?])(\\1+)~', '\\1', $str)); 

または1つのpreg_replaceコール(アリックスアクセルのおかげで)に

$str = preg_replace(array('~([.,!?])(\\1+)~', '~[?!]{2,}~'), array('\\1', '?'), $str); 

ちょうどあなたが括弧内の気にすべての句読点を列挙

UPD!?ちょうど巣を処理すること別の正規表現で

すべての意味の説明:

preg_replace('~([.,!?])(\\1+)~', '\\1', $str) 

発現([.,!?])(\\1+)手段 - それは少なくとも一つの同じ文字\\1+\\1によって先行されている場合にのみ.,!?のいずれかを見つける - 以前のマッチを参照し、+at least oneあります。

これをすべて1つのcharに置き換えてください。

外側表現[?!]{2,}find all ? or ! if they are at least 2 in a rowを意味し、あなたがにpreg_replaceを使用することができます?

+0

私はこの解決策が疑問符の問題を考慮しているとは思いません。編集 - 実際には、私はこれをテストしたが、全く動作しません。 :/ – Nathanael

+0

@ Nathanael Shermett:ああ、だから '! 'は常に'? 'につながるはずですか? '?!'についてはどうですか? – zerkms

+0

?!まただろうか? – Nathanael

1

に置き換える:重複を取り除きます

$a="Hello... how are you!!?? Im bored!!!!!!"; echo preg_replace("/([.!?])+/iS","$1",$a); 

=> Hello. how are you? Im bored! 
+0

魅力的な作品です。あなたはどうやって説明することができますか? :) – Nathanael

+0

@Nathanael Shermett:それは '?!'で失敗するでしょう – zerkms

+0

うーん、あなたが正しいように見えます。それを指摘してくれてありがとう! – Nathanael

0
$string = "Hello... how are you!!?? I'm bored!!" 
$new_string = $string; 
foreach(array('.',',','?','!') as $value) { 
    $i = ; 
    do { 
    $prev_string = $new_string; 
    $string = str_replace($value . $value,$value,$string; 
    $i++; 
    } while ($string !== $prev_string && $i<100) 
} 

ではなく?!?。

私はこの2番目の解決策は、あなたの "bad_chars"の最初を維持して動作すると思います。 最後のものを保存したい場合は、その解決策もあります。

<?php 
$string = str_split($string); 
$new_string = array(); 
$i = 0; 
foreach($string as $key => $char) { 
    echo 'Processing: ' . $char . '<br />'; 
    $prev_key = $key - 1; 
    $prev_char = $string[$prev_key]; 
    if($i!== 0) { 
    if(in_array($char,$bad_chars) && in_array($prev_char,$bad_chars)) { 
     // do nothing 
    } else { 
     $new_string[] = $char; 
    } 
    } else { 
    $prev_char = $char; 
    $new_string[] = $prev_char; 
    } 
    $i++; 
} 
$string = implode('',$string); 
$new_string = implode('',$new_string); 
?><br /> 

<?php echo $string; ?><br /> 
<?php echo $new_string; ?><br /> 
+1

正規表現を取り入れて、戦いません! –

+0

小さい注記:これは1バイト文字セットでのみ機能し、正規表現による解決は1回のキーストロークで修正可能 – zerkms

+0

2番目の解決策を編集しました。多分それはマルチバイトの安全でしょうか?配列のトラバーサルは非常に高速ですが、正規表現は非常に遅いです。複雑な文字列からデータを取得するために正規表現を使用しますが、この単純な問題には意味があるかどうかはわかりません。私はどのワードプロセッサが使用するのだろうか。 –

関連する問題