11

朝SO。文字列に特定の文字のリストが含まれているかどうかを判断しようとしています。

これにはpreg_matchを使用する必要があることはわかっていますが、正規表現の知識が乏しく、このサイトの他の投稿から情報を収集することができませんでした。それらのほとんどは、文字列をaz、AZ、および0-9に制限したいだけなので. ただし、次のような特殊文字を許可したいのです! @ £が、以下の文字列にないものもあります。

照合する文字:# $ % ^ & * ( ) + = - [ ] \ ' ; , . / { } | \ " : < > ? ~

private function containsIllegalChars($string)
{
    return preg_match([REGEX_STRING_HERE], $string);
}

私は元々 Javascript でマッチングを作成しました。これは、文字列内の各文字をループし、一致する文字列が見つかるまで別の文字列内のすべての文字をループするだけでした。振り返ってみると、そのような古風な方法を使おうとしたことさえ信じられません。json の出現 (およびアプリケーションの書き直し) により、json を介してエラー メッセージを返すために、マッチを php に切り替えています。

正規表現の第一人者が上記の文字列を正規表現文字列に変換するのを手伝ってくれることを望んでいましたが、フィードバックをいただければ幸いです。

4

4 に答える 4

14

「許可されていない文字のリスト」の正規表現は必須ではありません。

をご覧になる場合がありますstrpbrk。それはあなたが必要とする仕事をするべきです。

使用例はこちら

$tests = array(
    "Hello I should be allowed",
    "Aw! I'm not allowed",
    "Geez [another] one",
    "=)",
    "<WH4T4NXSS474K>"
);
$illegal = "#$%^&*()+=-[]';,./{}|:<>?~";

foreach ($tests as $test) {
    echo $test;
    echo ' => ';
    echo (false === strpbrk($test, $illegal)) ? 'Allowed' : "Disallowed";
    echo PHP_EOL;
}

http://codepad.org/yaJJsOpT

于 2012-12-20T11:09:29.020 に答える
11
return preg_match('/[#$%^&*()+=\-\[\]\';,.\/{}|":<>?~\\\\]/', $string);
于 2012-12-20T11:10:38.213 に答える
3
$pattern = preg_quote('#$%^&*()+=-[]\';,./{}|\":<>?~', '#');

var_dump(preg_match("#[{$pattern}]#", 'hello world')); // false
var_dump(preg_match("#[{$pattern}]#", 'he||o wor|d')); // true
var_dump(preg_match("#[{$pattern}]#", '$uper duper')); // true

$pattern実装によっては、おそらく をキャッシュできます。

正規表現の外を見ていますが、strpbrkここでも言及されているように最適です)

于 2012-12-20T11:10:35.180 に答える
1

許可したい文字を次のように含めることで、探しているものを大幅に簡素化できると思います。

preg_match('/[^\w!@£]/', $string)

何が起こっているのかを簡単に説明すると、次のようになります。

  • [^] = 含まない
  • \w = 文字と数字
  • ! @ £ = 許可したい文字のリスト
于 2015-12-30T20:48:14.897 に答える