неприятности preg_match - PullRequest
       6

неприятности preg_match

0 голосов
/ 15 сентября 2010

Я пытаюсь сопоставить URL-адрес Youtube с регулярным выражением, чтобы проверить, действительно ли это. Это мой код:

if(preg_match('\bhttp://youtube.com/watch\?v=.*\b', $link))
{
    echo "matched youtube";
}

Но я получаю сообщение об ошибке:

Warning:  preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\ajax\youtube.php on line 22

Я признаю, что я полный новичок в регулярных выражениях, и я не очень хорошо их понимаю, но я пытаюсь научиться этому. Я сделал приведенное выше регулярное выражение с помощью этого онлайн-инструмента регулярных выражений:

http://gskinner.com/RegExr/

и это работает там. Так что же я делаю не так и есть ли лучший способ проверить URL-адрес YouTube?

Спасибо. :)

Ответы [ 4 ]

1 голос
/ 15 сентября 2010

PCRE требуют разделителей , которые разделяют регулярные выражения и необязательные модификаторы .

В этом случае предполагается \, но \ не является допустимым разделителем (см. Сообщение об ошибке). Используйте другой символ, например ~:

preg_match('~\bhttp://youtube\.com/watch\?v=.*\b~', $link)
1 голос
/ 15 сентября 2010

Здесь действительно нет необходимости в preg_match:

$url = "http://youtube.com/watch?v=abc";
if(strpos($url, "http://youtube.com/watch?v=") === 0) {
    echo "Valid";
}
0 голосов
/ 15 сентября 2010

При использовании preg_match регулярное выражение должно быть заключено в надлежащие разделители.

Например:

preg_match('/\bhttp://youtube.com/watch\?v=.*\b/', $link)

В вашем примере \ b обозначает границу слова, это недопустимый буквенно-цифровой разделитель, поэтому сообщение об ошибке

0 голосов
/ 15 сентября 2010

Вы должны добавить дополнительные разделители к вашему регулярному выражению.Это используется для предоставления необязательных параметров:

preg_match('"\bhttp://youtube.com/watch\?v=.*\b"', $link) 

Символ / обычно используется в качестве разделителя регулярных выражений, но в вашем случае это заставит внутренний / экранироватьсяПоэтому для более ясного представления предлагаю использовать ".

...