これは文章サニタイザーです。
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つの問題があり、それらの周りの解決策が見つかりません:
- ピリオドのセットは「.. ..」に分割されています。何らかの理由で。疑問符の横に「.....」のままにしておく必要があります。
- 文字列のどこかに !?,のいずれかの文字が少なくとも 1 つある場合にのみ、文字列の最後はピリオドで終了する必要があります。(これらの文字の少なくとも 1 つが文字列に見つからない場合、その preg_replace は実行されるべきではありません)
2 番目の問題の例:
言及された文字がどこにも見つからないため、この文にはピリオドは必要ありません
この別の文には、それが必要です! なんで?上記の文字の少なくとも 1 つが含まれているため
(もちろん、終了期間はまだ存在しない場合にのみ配置する必要があります)
ご協力いただきありがとうございます!