0

私が作成したページでは、ユーザーは%をワイルドカード(例:192.168.1。%)として使用してIP(すべてIPv6ではなくIPv4)を送信できます。また、ワイルドカードなしで完全なIPを送信することもできます。IPは、通常のHTMLフォーム入力を介して投稿されるため、のようになり<input name=\"ip\" maxlength=\"15\"/>ます。

基本的に、IPに含まれるのは数字、ドット、パーセント記号(最大で2つ)のみであることを確認する必要があります。私は255を超える数字を入力する人にはあまり関心がありませんが、ドットごとに3つを超える数字を入力できるようにしたくありません。

正規表現はまったくわからないので、どこから始めればよいのかさえわかりません。[0-9]は0-9の数字しか許可しないことを私は知っていますが、それはおそらくあまり役​​に立たないでしょう。$ _POST ['ip']変数を区切り文字としてドットを使用してパーツに分割し、各パーツで正規表現を実行する必要がありますか?一度に実行する方がおそらく効率的です。

4

2 に答える 2

1

正規表現を使用してこれを行うことはできますが、複雑であり、より簡単な解決策は文字列関数との組み合わせであると思いますfilter_var()

擬似コード

  • substr_count()最大2を確保するためのワイルドカード
  • str_replace() 安全な数字のワイルドカード、たとえば50
  • 使用するfilter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)

これらのいずれかが失敗した場合は、IPが不良です。釣りを教えるために、コードはあなたに任せます。

于 2012-08-28T02:59:50.730 に答える
0

非常に難しいように見えますが、これはRegexBuddyによって盗まれた私の最も使用されているIP検証正規表現であり、「パーセント文字」で拡張されています...検証に使用したいので、すべての単純な正規表現は機能しませんここでは、「999.345.465.123」にも一致するため...

それが機能している場合は、私に知らせてください...

if (preg_match('/(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)/i', $_GET['ip'], $regs)) {
    // full validated ip
    $ip = $regs[0];

    // address octets directly?
    $first = $regs[1];
    $second = $regs[2];
    $third = $regs[3];
    $fourth = $regs[4];
}
于 2012-08-28T03:11:48.310 に答える