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