4

所以基本上我们需要一个正则表达式从字符串中去除多余的标点符号,只留下一个标点符号。

所以:

这是我的棒棒哒!!!!你不爱吗???!!!

会导致

这是我的棒棒哒!你不爱吗?!

我已经尝试过并试图得到这个,但我要么最终弄乱了字符串,要么它根本不起作用。我仍在学习正则表达式,所以请原谅这肯定是一个愚蠢的问题。

我想“标点符号”几乎是任何不是 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 回答