0

文字、数字、および次の文字を許可する正規表現を作成しようとして立ち往生しています:_-!?。、

これが私がこれまでに持っているものです:

/^[-\'a-zA-Z0-9_!\?,.\s]+$/      //not escaping the ?

そしてこのバージョンも:

/^[-\'a-zA-Z0-9_!\?,.\s]+$/     //attempting to escape the ? 

これらのどちらも、以下に一致することはできないようです。

「ああ、なぜ、この正規表現が機能しないのですか!かなりイライラしますか?イライラします-つまり、控えめに言ってください。ちょっと見てください、アンダースコア_今回は一致するのでしょうか?」

誰かが私が間違っていることを指摘できますか?私のスクリプトはユーザー入力(この場合は引用符で囲まれた段落)を受け取り、すべての空白を削除して、実際の入力に空白がないことを指摘する必要があります。

ありがとう!

更新:Lixのアドバイスのおかげで、これは私がこれまでに持っているものです:

/^[-\'a-zA-Z0-9_!\?,\.\s]+$/

しかし、それはまだ機能していませんか?

UPDATE2わかりました、入力に基づいて、これが起こっていることです。ユーザーが文字列を入力し、次の関数を使用して文字列を実行します。

$comment = preg_replace('/\s+/', '',   
htmlspecialchars(strip_tags(trim($user_comment_orig))));

したがって、最終的には、ユーザー入力はスペースを含まない文字列の長い文字列になります。次に、その文字列は次を使用して実行されます。

preg_match("@^[-_!?.,a-zA-Z0-9]+$@",$comment) 

ここで問題を引き起こしている可能性があるのは何ですか?

最終更新:

この正規表現を使用することになりました:

"@[-'A-Z0-9_?!,.]+@i"

皆さんありがとう!笑、私の間違いがどこにあったかを見つけたら、あなたは私を殺すつもりです!

さて、私はこのコードを持っていました:

if(!preg_match($pattern,$comment) || strlen($comment) < 2 || strlen($comment) > 60){

もう!!!コードのstrlen部分をわざわざ見ることはありませんでした。もちろん、毎回失敗するでしょう...私は60文字しか許可しませんでした!!!!

4

4 に答える 4

1

疑わしい場合は、クラス内の英数字以外の文字をエスケープして照合するのが常に安全であるため、次の点で問題ありません。

/^[\-\'a-zA-Z0-9\_\!\?\,\.\s]+$/

正規表現テスターを実行すると、ターゲットとの一致が問題なく検出されるため、すべてがうまくいかない場合は、他の場所で問題が発生する可能性があります。

実際に試合を試みるときに、ターゲットの周りで使用した引用符を含めていないと思いますか?で二重引用符のマッチングを作成しなかったので...

誰かが私が間違っていることを指摘できますか?私のスクリプトはユーザー入力(この場合は引用符で囲まれた段落)を受け取り、すべての空白を削除して、実際の入力に空白がないことを指摘する必要があります。

\sその場合、正しく機能していれば必要ありません。

于 2012-12-27T23:36:05.410 に答える
1

次のコードが期待どおりに機能するようになりました(php5を実行):

<?php
    $pattern = "@[-'A-Z0-9_?!,.\s]+@i";
    $string = "Oh why, oh why is this regex not working! It's getting pretty frustrating? Frustrating - that is to say the least. Hey look, an underscore_ I wonder if it will match this time around?";

    $results = array();
    preg_match($pattern, $string, $results);

    echo '<pre>';
    print_r($results);
    echo '</pre>';
?>

からの出力print_r($results)は次のとおりです。

Array
(
    [0] => Oh why, oh why is this regex not working! It's getting pretty frustrating? Frustrating - that is to say the least. Hey look, an underscore_ I wonder if it will match this time around?
)

http://writecodeonline.com/php/でテスト済み。

于 2012-12-27T23:57:57.043 に答える
0

内のほとんどの文字をエスケープする必要はありません[]。ただし、\s式内で必要なことは実行されません。2つのオプションがあります。手動で展開する(/^[-\'a-zA-Z0-9_!?,. \t\n\r]+$/)か、交互に使用する(/^(?:[-\'a-zA-Z0-9_!?,.]|\s)+$/)。

これをPHP文字列に入れていると想定しており、構文エラーを示唆したくないので、\前に残したことに注意してください。'

于 2012-12-27T23:38:48.003 に答える
0

文字クラス内で特別な意味を持つ唯一の文字は次のとおりです。

  • ダッシュ(範囲の区切り文字として使用できるため)。ただし、最初に使用される場合を除きます(この場合、範囲の一部ではないため)。
  • 閉じ括弧、
  • バックスラッシュ。

「純粋な正規表現」では、文字クラスは次のように記述できます。

[-_!?.,a-zA-Z0-9\s]

今、あなたはあなたの言語と文字列がどのように書かれているかに従ってエスケープする必要があるものは何でもエスケープする必要があります。これがPHPであるとすると、上記のサンプルをそのまま使用できます。\s これは文字クラスでも\s解釈されるため、文字クラスの外部で一致するものすべてに一致することに注意してください。

安全のためにエスケープを使用することを推奨するマニュアルもありますが、文字クラスの一般的な正規表現ルールを理解して適用すると、結果が短くて読みやすくなります;)

于 2012-12-27T23:46:33.803 に答える