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. ユーザーが複数の疑問符を書いた場合は、1 つに変換する必要があります (?????? = ?)。それは感嘆符に対してはうまく機能していますが、どういうわけか他の人には機能していません。

どんな助けでも大歓迎です!

4

2 に答える 2

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 つに変換する必要があります (?????? = ?)。それは感嘆符についてはうまくいきますが、どういうわけか他の人にはうまくいきません。

    は正規表現の特殊文字であるため、機能しません?。エスケープする必要があります。適切なエントリを次のように置き換えます。

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

そして今、出力は次のとおりです。

hello! there should be a space after the exclamation mark. right? yes. right.
于 2012-11-16T22:33:25.997 に答える
0

$pats疑問符を置き換えるために、これをあなたに追加してください。私は残りを終えていません。

'/(\?)\?+/',              # abc?????????
于 2012-11-16T22:21:04.213 に答える