[PHP]文字列中のURIのみを正規表現で抜き出す

Read More

文字列の中のURIを抜き出すには以下のような正規表現を使う

■URIの抜き出しパターン
<?php
$sTarget = "あいうえお kakikukeko http://xirasaya.com/?m=detail&hid=179 サシスセソ http://google.com";
$sPattern = '$\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$iu'; 
preg_match_all($sPattern, $sTarget, $res, PREG_PATTERN_ORDER); 
print_r($res[0]);
?>



■実行結果
Array (
[0] => http://xirasaya.com/?m=detail&hid=179
[1] => http://google.com
)



このようにいくつでもURIを抜き出せる。




パターン内の\bは意味がある。
<?php
/*
 * パターン内の \b は単語の境界を示す。
 * このため、独立した単語の"web"にのみマッチし、"webbing" や "cobweb" のような単語の一部にはマッチしない。 */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
?>
†PHPマニュアルより引用http://php.net/manual/ja/function.preg-match.php




URIを抜き出す正規表現ではパターンの範囲を示すデリミタが通常は'/'だが上記では'$'になっていることに注意したい。

これは範囲内で使用している'/'に対してエスケープ処理を行うと分かりづらい為。


あとPHPマニュアル(日本語訳版)ではエスケープ処理のことを"クォートする"と表現されていたのでそれも合わせてここに書いておく。

そういえばマジッククォートって言葉があるけど、よく考えるとそれもクォートって使ってるなあ。
今さら気が付いた。




まあURIの抜き出しの正規表現は少し手を加えればValidatorとしても利用できるので利用価値は高いかと。