1

drupalで1つのフォームを作成しました。ここには、「URL」というフィールドが1つあります。これで、サイトのユーザーはここに任意のURLを入力します。そのユーザーがURLを入力したので、それが適切なyoutubeまたはvimeoのURLであるかどうかを検証したいと思います。次のような例:

URL:www.youtube.com/video_Id URL:www.vimeo.com

strstrやpreg_matchのようなphp関数を使用することで簡単に認識できます。しかし、誰かが彼のブログのURLを入力して、youtubeについて次のようになっていると仮定します -www.learnyoutube.comまたはwww.mysite/about_youtube.comなど。

上記の場合、URLの文字列にyoutubeが含まれているため、検証は失敗します。

最後に、「 youtube」と「vimeo 」のビデオの有効な形式を知りたいので、それに応じてロジックを適用できます。

誰か他のアイデアもあるなら、助けてください。

4

3 に答える 3

4

私は、YoutubeとVimeoのURLに一致するように、複数のプロジェクトにわたってこれらの正規表現を微調整してきました。どちらもマッチングに最適で、PHPを使用preg_matchしてURL全体またはビデオIDのみを取得できます。私は自分のプロジェクトでそれを使用して、ビデオURLからIDを取得し、デフォルトの埋め込みが提供するよりも優れたYoutubeプレーヤーをフォーマットします。

/**
 * Fetches the ID of a Vimeo video given a URL
 *
 * @param string $source  Vimeo URL
 *
 * @return mixed          A video ID if matched, otherwise false
 */
function video_id_from_vimeo_url($source)
{
    $pattern = "/^(?:(?:https?:\/\/)?(?:www\.)?vimeo\.com.*\/([\w\-]+))/is";
    $matches = array();
    preg_match($pattern, $source, $matches);
    if (isset($matches[1])) return $matches[1];
    return false;
}

/**
 * Fetches the ID of a YouTube video given a URL
 *
 * @param string $source  YouTube URL
 *
 * @return mixed          A video ID if matched, otherwise false
 */
function video_id_from_youtube_url($source)
{
    $pattern = '/^(?:(?:(?:https?:)?\/\/)?(?:www\.)?(?:youtu(?:be\.com|\.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/is';
    $matches = array();
    preg_match($pattern, $source, $matches);
    if (isset($matches[1])) return $matches[1];
    return false;
}

/**
 * Generate a URL to a YouTube video with a YouTube video ID
 *
 * @param string $id     YouTube video ID
 * @param array $params  Query params to send to video
 *
 * @return string        A YouTube URL
 */
function youtube_video_url_with_id($id, array $params = array())
{
    $query = empty($params) ? '' : '?' . http_build_query($params);
    return esc_url("//youtube.com/embed/{$id}{$query}");
}

/**
 * Generate a URL to a Vimeo video with a Vimeo video ID
 *
 * @param string $id     Vimeo video ID
 * @param array $params  Query params to send to video
 *
 * @return string        A Vimeo URL
 */
function vimeo_video_url_with_id($id, array $params = array())
{
    $defaults = array(
        'color'    => 'ffffff',
        'title'    => 0,
        'byline'   => 0,
        'portrait' => 0,
    );
    $params = array_merge($defaults, $params);

    $query = empty($params) ? '' : '?' . http_build_query($params);
    return "//player.vimeo.com/video/{$id}{$query}";
}

すべての形式のYouTubeURLと一致する必要があります。使用例:

$url = "https://www.youtube.com/watch?v=buNGJm_s0XE";
$id = video_id_from_youtube_url($url); // buNGJm_s0XE

$url = "http://youtu.be/buNGJm_s0XE";
$id = video_id_from_youtube_url($url); // buNGJm_s0XE

$fmt_url = youtube_video_url_with_id($id);

またはVimeoのURL:

$id = video_id_from_vimeo_url('https://vimeo.com/ondemand/afilmaboutcoffee/112360104'); // 112360104
$id = video_id_from_vimeo_url('https://vimeo.com/112360104'); // 112360104

これらの関数と正規表現を組み合わせて正しいフォーマッターに一致させ、すばらしいビデオを出力します。最近のEmberアプリには、URLの変更を監視し、HTML出力を更新してビデオのプレビューを表示するJavascriptコンポーネントがあります。PHPバージョンと同じ正規表現を使用します。このようなもの(coffeescript):

  YOUTUBE_EXPR = /^(?:(?:(?:https?:)?\/\/)?(?:www\.)?(?:youtu(?:be\.com|\.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/i
  VIMEO_EXPR   = /^(?:(?:https?:\/\/)?(?:www\.)?vimeo\.com.*\/([\w\-]+))/i
于 2014-11-07T23:33:10.507 に答える
2

URLの先頭にあるドメイン部分と一致させることができます

preg_match('#^((http://)|(https://)){0,1}(www\.){0,1}youtube\.com#', $url)

このpregの仕組みは次のとおりです。

^ - everything after this should be at the very beginning
( - start sub pattern which can be "http://" or "https://"
   (http://)
   | - OR       
   (https://)
) - end subpattern 
{0,1} - look for 0 to 1 occurrences of the previous subpattern
(www\.){0,1} - look for 0 to 1 occurrences of "www."
youtube\.com - look for "youtube.com"

そして、それは次で始まるものと一致します:

http(s)://www.youtube.com
http(s)://youtube.com
www.youtube.com
youtube.com

編集:JavaScriptバージョン:

var site= 'http://www.youtube.com';
var match = site.match(/^((http:\/\/)|(https:\/\/)){0,1}(www\.){0,1}youtube\.com/);

match文字列が一致する場合と一致しない場合は、一致する値の配列がありますnull

于 2012-09-23T07:00:59.057 に答える
1

埋め込みフィールドを使用していると思います。はいの場合、埋め込みは適切なYouTubeまたはビデオ(構成ページでサイトを確認する必要があります)のURLを自動的に検証します。いいえの場合、Pinetreeはそれを適切に説明しているので、それを使用してください。

于 2013-01-07T15:06:49.647 に答える