这是一个句子消毒剂。
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;
}
这是测试语句:
你好朋友.....?你好吗 [}}}}}}
它应该返回:
你好朋友.....?你好吗
但相反,它正在返回:
你好朋友。.. .. ? 你好吗。
所以有两个问题,我找不到解决方案:
- 这组时期被分成“.. .. .” 由于某些原因。它们应该在问号旁边保留为“.....”。
- 字符串的结尾必须仅以句点结尾,并且仅当字符串中的任何位置至少存在以下字符之一时:!?,。(如果在字符串中找不到这些字符中的至少一个,则不应执行 preg_replace)
第二个问题的例子:
这句话不需要结束句号,因为找不到提到的字符
这句话,需要!为什么?因为它包含至少一个提到的字符
(当然,结束期只有在不存在的情况下才应该放置)
谢谢你的帮助!