PHP正则表达式删除多余的标点符号

时间:2012-08-31 15:44:09

标签: php regex

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

所以:

  

这是我很棒的字符串!!!!!你不喜欢它吗??? !! ?? !!

会导致

  

这是我很棒的字符串!你不喜欢它吗?!

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

我猜“标点符号”几乎不是A-Za-z0-9

编辑我似乎误解了原来的要求。使用下面接受的解决方案,我将如何调整它,以便无论你有什么字符,标点符号仅限于第一个?

IE

  

??? !!!!!!

将成为

  

并且

  

这是我的字符串!!!?!?!?!?不是很棒???!?!?!!

会变成

  

这是我的字符串!不是很棒吗?

3 个答案:

答案 0 :(得分: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?!

它通过使用正向前瞻来查看该字符串中是否再次出现该字符。如果是,则用空字符串替换。

答案 1 :(得分: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?!

答案 2 :(得分: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);

Here's a demo.