簡體   English   中英

PHP Regex去除多余的標點符號

[英]PHP Regex to strip excess punctuation

因此,基本上我們需要一個正則表達式來從字符串中去除多余的標點符號,僅保留其中一個標點符號。

所以:

這是我很棒的弦! 你不喜歡它嗎?

會導致

這是我很棒的弦! 你不喜歡嗎?

我已經嘗試了很多次,但是最終要么破壞了字符串,要么根本不起作用。 我仍在學習正則表達式,因此請原諒確實是一個愚蠢的問題。

我猜“標點符號”幾乎是不是A-Za-z0-9的任何東西

編輯看來我誤解了我們的原始要求。 使用下面接受的解決方案,我將如何調整它,以便無論您使用什么字符,標點符號都僅限於第一個?

IE瀏覽器

??? !!!!!!

會變得公正

這是我的弦!!!!!?!?!? 很棒嗎???!?!!?!!

會成為

這是我的弦! 很好嗎?

與其他答案類似,但應以任何順序處理任何非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?!

它通過使用積極的前瞻來查看字符是否再次出現在此標點符號字符串中。 如果是這樣,則將其替換為空字符串。

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?!

嘗試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);

這是一個演示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM