#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:
Несколько проблем:
- Вы добавили разделители PHP (
#
) в ваше регулярное выражение JavaScript. - JavaScript не поддерживает lookbehind, поэтому вы не можете использовать регулярное выражение PHP в JavaScript
- Ваше регулярное выражение избыточно. Третий вариант соответствует всему, чему соответствовал бы первый.
- Регулярное выражение содержит ошибку:
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