2012-11-16 39 views
1

我當前的PHP句消毒功能:正則表達式來消毒的句子,幾乎做到了

function sanitize_sentence($string) { 
    $pats = array(
    '/([.!?]\s{2}),/',  # Abc. ,Def 
    '/\.+(,)/',    # ......, 
    '/(!)!+/',    # abc!!!!!!!! 
    '/\s+(,)/',    # abc , def 
    '/([a-zA-Z])\1\1/'); # greeeeeeen 
    $fixed = preg_replace($pats,'$1',$string); 
    $fixed = preg_replace('/,(?!\s)/',', ',$fixed); 
    return $fixed; 
} 

echo sanitize_sentence('hello!!!!!!there should be a space after the exclamation mark.right???????yes.right,'); 

結果應該是:

你好!感嘆號後應該有空格。對?是。對。

那麼,是什麼人仍下落不明是!?

  1. 額外的空間應後的任何插入,如果在適當的更多的文本。
  2. 如果最後一個字符是逗號(或其他與a-zA-Z0-9!不同的字符),則應將其替換爲點。
  3. 如果用戶寫入多個問號,則應將其轉換爲一個(?????? =?)。對於我來說,這對驚歎號工作正常,但不知何故,它不適用於其他人。

任何幫助將不勝感激!

回答

2

您的要求:

  1. 一個額外的空間應插入任何!?,.後,如果在合適的更多的文本。

    我們可以使用另一個正則表達式來做到這一點置換:

    $fixed = preg_replace('/([!?,.])(\S)/', '$1 $2', $fixed); # spaces after punctuation, if it doesn't exist already 
    
  2. 如果最後一個字符是一個逗號(或任何其它字符超過a-zA-Z0-9!?.不同),它應該以一個點來代替。

    你可以用這一個正則表達式,在文本的結尾固定:

    $fixed = preg_replace('/[^a-zA-Z0-9!?.]+$/', '.', $fixed); # end of string must end in period 
    
  3. ,如果用戶寫不止一個問號,它應該被轉換成一個(????? ?=?)。對於我來說,這對驚歎號工作正常,但不知何故,它不適用於其他人。

    這不起作用,因爲?是正則表達式中的一個特殊字符,您需要將其轉義。更換與此相應的條目:

    '/(!|\?)\1+/',    # abc!!!!!!!!, abc????????? 
    

而現在,the output is

hello! there should be a space after the exclamation mark. right? yes. right. 
+0

在你的解釋很詳細。非常感謝你! – andufo

+0

剛剛注意到應該覆蓋的最後一個細節;如果用戶輸入:hello !. (或你好!)它應該被轉換成(你好!) - 它也適用於你好?等 - 這隻適用於期間。 – andufo

+0

對不起,只是注意到它不會與'你好朋友.....?'這些時期被分成'.. .. ..'出於某種原因。 – andufo

0

將此添加到您的$pats以替換問號。其餘的我沒有完成。

'/(\?)\?+/',    # abc?????????