0

私は次のようなPHP配列を持っています(MySQLデータベースからのもので、YouTubeは単なる例です):

[regexpr] => array(4) (
   [0] => (string) http://*.youtube.com/v/*
   [1] => (string) https://*.youtube.com/v/*
   [2] => (string) http://youtu.be/*
   [3] => (string) http://m.youtube.com/watch*
)

今、私が達成しようとしているのは、URL で一致するものを見つけることです (この場合、URL が有効な YouTube URL であるかどうかを確認します)。

私が試したことは次のとおりです。

for($i = 0; $i < count($regexpr); $i++)
   $regexpr[$i] = preg_quote($regexpr[$i]); // because of the URLs

$expr = '/(('. implode('|', $regexpr) . '))/i'; // Concatenating the ORs

$found = preg_match($expr, 'http://www.youtube.com/[foo]&v=MyVidID', $matches);

ただし、残念ながら、これらの式を正常に連結できませんでした。成功した「ヒット」はありません。

この問題を解決する方法についての指針はありますか?

グラシアス!

4

2 に答える 2

3

問題はあなたのソース「正規表現」です:

http://*.youtube.com/v/*
       ^---            ^---

アスタリスクは、一般的なワイルドカードではなく、「前の 0 個以上」の文字です。したがって、/文字をオプションにすることになります。あなたが望むのは、おそらく.*「0個以上の任意の文字」である

ただし、これらを preg_quote を介して渡しているため、正規表現のメタ文字はすべてエスケープされるため、実際にはワイルドカードを渡していません。リテラルのアスタリスク、リテラルのピリオドなどを渡しています...

自分で正規表現をエスケープし、preg_quote ステージをスキップする必要があります。

http:\/\/.*\.youtube.com\/v\/.*
于 2012-05-28T16:19:31.463 に答える
2

URLを解析してから、ホワイトリストと比較するとどうなりますか?何かのようなもの:

$myurls= array('http://example.com', 'http://foo.com/', 'http://mysite.com/', 'http://youtube.com?feeble=2&blob=ixls');
$whitelist=array('foo.com', 'youtube.com');

foreach($myurls as $url){
    $parsed=parse_url($url);
    if(in_array($parsed['host'],$whitelist)) echo "$url OK";
}
于 2012-05-28T16:28:48.907 に答える