Регулярное выражение Javascript, эквивалентное сбою php

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Думаю, это довольно простая проблема. У меня есть регулярное выражение и php, который выглядит следующим образом:

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

(Это удаляет youtube-код из их различных URL-адресов). Я должен перенести это на javascript, и я хочу использовать ту же строку регулярного выражения.

Я пробовал следующее:

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

Но это выдает мне эту ошибку в Firebug: invalid quantifier

Кто-нибудь знает, что я делаю не так?

(У меня нет опыта работы с регулярными выражениями в Javascript. Поэтому, пожалуйста, извините за мой глупый вопрос)

Ответ №1:

Несколько проблем:

  1. Вы добавили разделители PHP ( # ) в ваше регулярное выражение JavaScript.
  2. JavaScript не поддерживает lookbehind, поэтому вы не можете использовать регулярное выражение PHP в JavaScript
  3. Ваше регулярное выражение избыточно. Третий вариант соответствует всему, чему соответствовал бы первый.
  4. Регулярное выражение содержит ошибку: youtu.be должно быть youtu.be .

Попробуйте это вместо:

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

Это даст точно такие же результаты, что и ваше регулярное выражение PHP, но его намного легче читать. Вернет ли оно правильные результаты — это другой вопрос — качество регулярного выражения PHP заставляет меня подозревать, что у него может быть больше проблем, чем просто очевидные.

Комментарии:

1. Ах, я упустил это из виду при исследовании. В итоге вместо этого использовалось /^.*((youtu.be/)|(v/)|(embed/)|(watch?))??v?=?([^#amp;?]*).*/ . Я надеюсь, что это сработает. Хотел сохранить существующее регулярное выражение, потому что оно так хорошо работало в моем php-скрипте. В любом случае, спасибо, дело закрыто.

Ответ №2:

У вас все еще есть # разделитель в вашем регулярном выражении из PHP … попробуйте удалить это:

 yturl.match(/(?<=v=)[a-zA-Z0-9-] (?=amp;)|(?<=v/)[^amp;n] |(?<=v=)[^amp;n] |(?<=youtu.be/)[^amp;n] /)
  

Ответ №3:

PHP preg_match использует регулярное выражение в стиле Perl, чего нет в Javascript. Быстро прочитайте в: http://www.thespanner.co.uk/2008/02/01/javascript-regular-expressions / и дайте мне знать, если это поможет вам понять различия.

Ответ №4:

В вашем регулярном выражении JavaScript вы использовали ‘/’ в качестве разделителей, но вы также добавили разделители ‘#’ из версии PHP.

удалите символы ‘#’ из версии JS