這是一句殺菌劑。優化正則表達式的語句消毒劑
function sanitize_sentence($string) {
$pats = array(
'/([.!?]\s{2}),/', # Abc. ,Def
'/\.+(,)/', # ......,
'/(!|\?)\1+/', # abc!!!!!!!!, abc?????????
'/\s+(,)/', # abc , def
'/([a-zA-Z])\1\1/'); # greeeeeeen
$fixed = preg_replace($pats,'$1',$string); # apply pats
$fixed = preg_replace('/(?:(?<=\s)|^)[^a-z0-9]+(?:(?=\s)|$)/i', '',$fixed); # bad chunks
$fixed = preg_replace('/([!?,.])(\S)/', '$1 $2', $fixed); # spaces after punctuation, if it doesn't exist already
$fixed = preg_replace('/[^a-zA-Z0-9!?.]+$/', '.', $fixed); # end of string must end in period
$fixed = preg_replace('/,(?!\s)/',', ',$fixed); # spaces after commas
return $fixed;
}
這是測試一句話:
你好[[[[[[]]]]]]朋友.....?你怎麼樣[}}}}}}
它應該返回:
招呼朋友.....?你怎麼樣
但是,相反它返回:
招呼朋友。 .. ..?你好嗎。
因此,有2個問題,我無法找到他們圍繞一個解決方案:
- 設定的時間段被分成「.. ..。」因爲某些原因。它們應該在問號旁邊保持爲「.....」。
- 如果字符串中的任何位置至少有一個字符,則字符串的結尾必須僅在且僅有的句點結束:!?,。(如果在字符串中沒有找到的那些字符中的至少一個,即preg_replace函數應該不被執行) 對於第二個問題
實例:
這個句子沒有需要一個結束期間因爲提到的字符無處可尋
這個其他的句子,需要它!爲什麼?因爲它含有以上列出的字符
的至少一個
感謝您的幫助(當然,期末應只如果它不存在,就放在)!
通過正則表達式的英語語法驗證永遠不會結束。 – 2012-11-18 21:35:14
如果您不能通過正則表達式解析(X)HTML,**您想如何解析口語**?它們比某些XML標記更不規則。 – ComFreek
當你有一把錘子,一切看起來像一個釘子... – Toni