2

次の文字列があるとします。Hello... how are you!!?? I'm bored!!

可能な限り連続した句読点を削除し、「!?」のような状況が発生した場合に疑問符を保持したいと思います。フィルタリングされた文字列は次のように表示されます。

Hello. how are you? I'm bored!

ベストアンサーは、この問題を解決する最も簡潔なソリューションになります。正規表現がこれを解決するための最良の方法になると思いますが、正規表現に関する私の知識は非常に限られており、これを解決する方法がわかりません。ただし、正規表現以外のソリューションでは問題ありません。あなたが提供するコードの説明は、悪魔のように単純でない限り、また素晴らしいでしょう。

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

4

3 に答える 3

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

または1回のpreg_replace呼び出しで(Alix Axelに感謝)

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

中かっこで気になる句読点をすべて列挙するだけです

UPD!?別の正規表現でネストするだけで処理する

それが何を意味するかについての説明:

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

この式は、-の前に少なくとも1つの同じ文字が付いている場合([.,!?])(\\1+)にのみ、いずれかを検索することを意味します。ここで、-は前の一致への参照であり、はです。.,!?\\1+\\1+at least one

そして、これらすべてを1つの文字だけに置き換えます。

外側の表現は、それを[?!]{2,}意味find all ? or ! if they are at least 2 in a rowし、それを置き換える?

于 2012-05-11T04:07:32.850 に答える
1

you can use preg_replace:

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

=> Hello. how are you? Im bored!
于 2012-05-11T04:15:27.363 に答える
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 />
于 2012-05-11T04:26:12.847 に答える