1

私は文字通り壁に頭をぶつけています。私はこの正規表現パターンを持っています

(?:youtu\.be\/|youtube.com\/(?:watch\?.*\bv=|embed\/|v\/)|ytimg\.com\/vi\/)(.+?)(?:[^-a-zA-Z0-9]|$)

YouTubeビデオのIDを抽出します。ここでやってみた

http://www.regular-expressions.info/javascriptexample.html

件名の文字列をhttp://youtube.com/watch?v=21312321とすると、うまくいきます。

ただし、私のサイトには、次の入力フィールドがあります

<input type="text" name="status" id="status" placeholder="Post a youtube video link">

そして次のjqueryコード

$('#status').keyup(function(event){
    var value = $(this).val();
    var pattern = "(?:youtu\.be\/|youtube.com\/(?:watch\?.*\bv=|embed\/|v\/)|ytimg\.com\/vi\/)(.+?)(?:[^-a-zA-Z0-9]|$)";
    var re = new RegExp(pattern);
      if (value.match(re)) {
        console.log("Successful match");
      } else {
        console.log("No match");
      }     
}); 

上記と同じビデオを使用すると、結果は「一致しません」です。どうすればそれが可能になるのでしょうか。ここで何がうまくいかないのか教えてください。

4

1 に答える 1

2

代わりに正規表現リテラルを使用します。

var re = /(?:youtu\.be\/|youtube.com\/(?:watch\?.*\bv=|embed\/|v\/)|ytimg\.com\/vi\/)(.+?)(?:[^-a-zA-Z0-9]|$)/;

何が起こっているかというと、文字列はすでにエスケープを「評価」しているため、\.and\bが and になり.、バックスペース文字になります。new RegExpはほとんどの場合間違った関数であり、動的な正規表現がある場合にのみ本当に役立ちます (これもほとんどの場合間違っています) — 正規表現リテラルはより効率的で読みやすく、エラーが発生しにくいです。 .

(また、youtube.comおそらくそうあるべきyoutube\.comです。)

于 2013-03-12T14:15:52.627 に答える