2011-08-07 5 views
0

私はこの正規表現を使用していますが、すべてのシナリオではうまく動作しませんが、たとえば、長いURLで "http://www.gob.cl/especiales/politicas-y-propuestas-de -accion-para-el-desarrollo-de-la-educacion-chilena /「それは私を返すだけです」http://www.gob。 URL長いURLを解析する正規表現

の一部としてここに私のコード

 
    $regexUrl = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regexUrl .= "([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;?&=\$_.-]+)[email protected])?"; // User and Pass 
    $regexUrl .= "([a-zA-Z0-9-]+)\.([a-zA-Z]{2,3})"; // Host or IP 
    $regexUrl .= "(\:[0-9]{2,5})?"; // Port 
    $regexUrl .= "(\/([a-zA-Z0-9+\$_-]\.?)+)*\/?"; // Path 
    $regexUrl .= "(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
    $regexUrl .= "(#[a-zA-Z_.-][a-zA-Z0-9+\$_.-]*)?"; // Anchor 
    //if(preg_match_all("#\bhttps?://[^\s()]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#", $message, $matches1, PREG_PATTERN_ORDER)) 
    //$pattern = '/((https?|ftp)\:(\/\/)|(file\:\/{2,3}))?(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((([a-zA-Z0-9]+)(\.)?)+)(\.)(com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|[a-z]{2}))([\/][\/a-zA-Z0-9\.]*)*([\/]?(([\?][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)([\&][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)*))?/'; 
    if(preg_match_all("/$regexUrl/", $urlMessage, $matches1, PREG_PATTERN_ORDER)) 
    { 
     try 
     { 
      foreach($matches1[0] as $urlToTrim1) 
      { 
       $url= $urlToTrim1; 
       echo $url; 
      } 
     } 
     catch(Exception $e) 
     { 
      $url="-1"; 
     } 
    } 

は、URLのすべての種類を解析することができ、一般的な正規表現が存在できます。正規表現

"([a-zA-Z0-9-]+)\.([a-zA-Z]{2,3})" 

答えて

2

あなたのホストまたは-IP部分は、内側の最大の単一のドットで認めていません。したがって、「www.xyz.com」は決して一致しません。

私は何をあなたの特定の要件を知りませんが、ホスト部分のため

"([^/?#:]+)" 

のようなものとなることがあります。 //またはhttps://

((?:http|https)(?::\\/{2}[\\w]+)(?:[\\/|\\.]?)(?:[^\\s"]*))

-1

URLはhttps://またはhttp://で始まり、特別な文字セットに限定されたシーケンスを持つことができるという前提です。

それから私は、すべてのURLの詳細を取得する$mhttp://www.php.net/manual/en/function.parse-url.phpを使用することができます

編集:あなたがテキストを解析している場合も、あなたは、URLの末尾にピリオド(.)およびその他の句読点をチェックすることをお勧めします。私は、URLの末尾がhttp://example.comのように文の最後にある場合、人は.をURLの末尾に置くことができることに気付きました。

だから私はこのような何か:このダウンは好奇心から選ばれた理由

if (($url[$pos]==='!') || ($url[$pos]==='.')) { // probably do not want these chars at the end of a url! 
    $url = substr($url, 0, $pos); 
} 
+0

を? – Chamilyan

+0

(1) '(?:http | https)'は不必要に冗長で非効率的です。 'https?'はうまくいきます。 (2) '/'を '/'を正規表現の区切り文字として使うとエスケープする必要があります。他にも多くの選択肢があります。 (3)文字列リテラル区切り文字として '' 'の代わりに' ''を使うと二重エスケープは必要ありません(4)文字クラスの中で '.'はエスケープする必要はなく、' | 'はとにかく '[^ \ s"] * 'はそれらの両方にマッチするので、' [/。]? 'は無意味です。文字。 (6)正規表現全体を '()'で囲む必要はありません。 (...)私は行くことができる...;) –

+0

ええ、それは動作します;)すべての良い。 – Chamilyan

1

をここで$テキストからすべてのURLを抽出するための私のいずれかになります。

preg_match_all('#(https?://[a-z0-9\.\-_\#%&=/?;,!:[email protected]\$\+]+)#iu', $text, $m); 

それは上だあなたはhttpで始まるすべてのものと一致についてはどのように

+0

+1。最後に一致した文字が禁止されている文字の1つである場合、ルックバック文字を使用して正規表現自体を強制的にバックアウトすることもできます: '' #https?:// [a-z0-9 ._ \#%&=/?;、!:〜 @ $ + - ] +(?<![。!])#iu'' –

関連する問題