-1

割り当てを完了しようとしていますが、最後の1つはURLを検証することだけです

要件は次のとおりです。

urlは英数字と次の文字のみを許可します:/。〜?= +&2つのピリオドを連続して存在させることはできません。

これが私が今まで持っているものですが、うまくいきません

m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|

だから今、私が入力したものはすべて、私が行うマッチングプロセスを通過するだけで何が起こりますか?これは次のようなものです

$return = $search =~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;

そのため、検索ボックスに何も入力しなくても、常にtrueが返されます。

4

2 に答える 2

2

多分次のように動作します:

use Data::Dumper;
$url = 'http://stackoverflow.com/questions/11927730/regular-expression-validate-url-in-perl';
@ds = $url =~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;
print Dumper(\@ds);

出力:

$VAR1 = [
          'http',
          'stackoverflow.com',
          '/questions/11927730/regular-expression-validate-url-in-perl',
          undef,
          undef
        ];
于 2012-08-13T03:29:24.780 に答える
2

これが私の正規表現タービュレーターから得ているものです(まもなく商用製品になります)

グループカウントなし

 (?:                                                 #(.*))?
      ( [^:/?\#]+ )
      :
 )?
 (?:
      //
      ( [^/?\#]* )
 )?
 ( [^?\#]* )
 (?:
      \?
      ( [^\#]* )
 )?
      (  <-- Unbalanced  '('
      ?:

グループカウント付き

     (?:                                                 #(.*))?
1         ( [^:/?\#]+ )
          :
     )?
     (?:
          //
2         ( [^/?\#]* )
     )?
3    ( [^?\#]* )
     (?:
          \?
4         ( [^\#]* )
     )?
          (  <-- Unbalanced  '('
          ?:
于 2012-08-13T03:40:58.877 に答える