4

したがって、基本的には、文字列から余分な句読点を取り除き、句読点文字を 1 つだけ残す正規表現が必要です。

そう:

これは私の素晴らしい弦です!!!!! 好きじゃないですか???!!!!??!!

結果として

これは私の素晴らしい弦です!好きじゃない?!

私はこれを取得しようと試みましたが、文字列を壊してしまうか、まったく機能しません。私はまだ正規表現を学んでいるので、確かにばかげた質問であることを許してください。

「句読点」は、A-Za-z0-9 以外のほとんど何でもいいと思います

編集当初の要件を誤解していたようです。以下の受け入れられた解決策を使用して、どの文字を使用していても、句読点が最初の文字のみに制限されるように調整するにはどうすればよいですか?

IE

???!!!!!!!!

公正になるだろう

?

これは私のひもです!!!!?!?!?!? いいじゃないですか???!?!?!!

になるだろう

これが私のひもです!それは素晴らしいことではありませんか?

4

3 に答える 3

4

他の回答と同様ですが、文字以外の0-9a-zA-Z文字を任意の順序で処理する必要があります。

$newstring= preg_replace('/([^\w\s])(?=[^\w\s]*\1)/', '', $oldstring);

向きを変える必要があります

This is my awesome string!!!!! Don't you love it???!!??!!

の中へ

This is my awesome string! Don't you love it?!

これは、前向きな先読みを使用して、この句読点の文字列に文字が再び表示されるかどうかを確認することで機能します。含まれている場合は、空の文字列に置き換えられます。

于 2012-08-31T16:05:13.430 に答える
1

のようなものpreg_replace('#([!?])\1+#', '$1')、おそらく?例えば:

$t = 'This is my awesome string!!!!! Don\'t you love it???!!??!!';
$u = preg_replace('#([!?])\1+#', '$1', $t);

// to clear out all these '?!?!...' and '!?!?...' sequences.
$u = preg_replace('#(\?!|!\?)\1+#', '$1', $u); 


echo $u; // This is my awesome string! Don't you love it?!
于 2012-08-31T15:47:27.030 に答える
1

試してくださいpreg_replace_callback

preg_replace_callback('/[!?]+/', function($m) {
    $excl = strpos($m[0], '!');
    $ques = strpos($m[0], '?');

    if($excl !== false && $excl <= $ques) {
        return $ques === false ? '!' : '!?';
    } else {
        return $excl === false ? '?' : '?!';
    }
}, $str);

これがデモです。

于 2012-08-31T15:49:01.077 に答える