2011-11-14 38 views
0

これはかなり単純な問題だと思います。PHP正規表現に相当するJavascriptの正規表現

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $v, $matches); 

(これは、URLのそれらの異なる種類からユーチ​​ューブコードを除去します):私はこのようになります正規表現とPHPを持っています。私はこれをjavascriptに移植しなければならず、同じ正規表現文字列を使いたい。

私は次のことを試してみた:

yturl.match(/#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#/) 

しかし、これは私のFirebugでこのエラーを与える:invalid quantifier

誰もが私が間違っているのか知っていますか?

(私はJavaScriptで正規表現との経験がないので、私のばかな質問をお許しください。)

答えて

5

いくつかの問題:

  1. あなたはあなたのJavaScriptの正規表現にPHPの区切り文字(#)を追加しました。
  2. JavaScriptはlookbehindをサポートしていないため、JavaScriptでPHP正規表現を使用することはできません。
  3. あなたの正規表現は冗長です。 3番目の選択肢は、最初のものと一致するものすべてに一致します。
  4. 正規表現にはエラーがあります:youtu.beyoutu\.beである必要があります。

代わりにこれを試してみてください:

var myregexp = /\b(?:v\/|v=|youtu\.be\/)([^&\n]+)/; 
var match = myregexp.exec(subject); 
if (match != null) { 
    result = match[1]; 
} else { 
    result = ""; 
} 

これはあなたのPHPの正規表現とまったく同じ結果が得られますが、それは、より読みやすいです。それが正しい結果を返すかどうかは別の質問です.PHP正規表現の品質は、明らかな問題よりも多くの問題を抱えている可能性があります。

+0

ああ、私はそれを見落として研究しています。 '/ ^。((youtu.be \ /)|(v \ /)|(埋め込み\ /)|(watch \?))\\ v?=? ] *)。*/'を使用します。私はそれがうまくいくことを望む。私のPHPスクリプトでうまく働いたので、既存の正規表現を維持したいとにかくありがとう、大丈夫です。 – OptimusCrime

0

あなたはまだPHPからあなたの正規表現で#区切り文字を持っている...それを削除してみてください:

yturl.match(/(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be\/)[^&\n]+/) 
0

JavaScriptの正規表現では、区切り文字として '/'を使用しましたが、PHPバージョンの区切り文字 '#'も追加しました。

JSバージョン