2013-07-24 4 views
2

Я хочу сделать preg_match в моем коде, но результат ничего ... (или нулевой или пустой?)preg_match возвращение ничего

$domain = "stackoverflow.com"; 

$uriToTest = "http://stackoverflow.com/"; 

$pattern = "/^http(s)?://(([a-z]+)\.)*".$domain."/"; 

echo preg_match($pattern, $uriToTest); 

В чем проблема?

+0

Я думаю, что вы получили сообщение об ошибке, да? –

+1

У вас есть ошибка - вам нужно избегать ваших косых черт. preg_match возвращает false – SmokeyPHP

+0

также вам нужно сбежать. в. – Tdelang

ответ

3

Если вы посмотрите на свой шаблон, именно этот

/^http(s)?://(([a-z]+)\.)*stackoverflow.com/ 

Разделитель используется как символ соответствия, и если у вас были ошибки, вы получите ошибку "Unknown modifier". Итак, первый совет: TURN ERROR REPORTING ON!

Чтобы исправить ошибку, попробуйте использовать другой разделитель, например. {}, так как это проще, чем читать нагрузки leaning toothpicks ...

{^http(s)?://(([a-z]+)\.)*stackoverflow.com} 

Другой проблемой является точкой в ​​$domain становится матчем группового символа - в любое время вставить неизвестные данные в регулярное выражение, получить в привычке использовать preg_quote, чтобы избежать его, например

$pattern = "{^http(s)?://(([a-z]+)\.)*".preg_quote($domain, '{')."}"; 

(Примечание - хороший улов STEMA в комментариях: если вы используете другой разделитель, вы должны передать эту preg_quote Это достаточно умно, чтобы обнаружить спаренные разделители, так что если вы передаете { он будет также избежать }.)

+1

+1 для добавления 'preg_quote ($ domain)' к вашему ответу. Но не следует ли добавлять разделитель в качестве параметра, например 'preg_quote ($ string, '/')'? Но я понятия не имею, как вы можете добавить его, если вы используете пару скобок в качестве разделителей. – stema

+0

Это действительно хороший момент - я проверил, и если вы пройдете '{', он тоже убежит '}'. Я изменю. –

+0

Я понял, в чем проблема. Я пробовал {}, но я не знал preg_quote ... - Почему, когда я добавляю косую черту в конце, это не сработало? Например: «{^ http (s)?: // (([az] +) \.) *" .preg_quote ($ domain, '{'). "/}" (Я хочу поймать это, чтобы избежать домена например, stackoverflow.com.eu ...) Извините за мой глупый вопрос ... но регулярное выражение в PHP не является моим другом ^^ – Tata2

0

Edited

$domain = "stackoverflow.com";

$uriToTest = "http://stackoverflow.com/"; 

    $pattern = "^http(s)?://(([a-z]+)\.)*".$domain."^"; 

    preg_match($pattern, $uriToTest,$matches); 
    print_r($matches); 

+0

Почему вы используете начало строкового якоря '^' как разделитель регулярных выражений? – stema

+0

Inorder, чтобы избежать ошибок. Префикс preg_match должен быть запущен с обратной косой чертой. Вы можете написать таким же образом $ pattern = "^ \ http (s)?: // (([a-z] +) \.) *". $ Domain. "^"; –

+0

Я согласен, я думаю, что это путаный совет –

0

Вы, скорее всего, получить ошибку и preg_match возвращает ложь, так как вы не избежать ваш слэша в вашем выражении. Либо использовать что-то еще вроде # как выражения разделители или избежать любой слэша, чтобы остановить анализатор от попыток закончить выражение (/ должно быть \/ - или изменить / на обоих концах, чтобы быть #)

//Quick fix to yours 
$pattern = "/^http(s)?:\/\/(([a-z]+)\.)*".preg_quote($domain,'/')."/"; 
//More legible fix 
$pattern = '#^https?://(([a-z]+)\.)*'.preg_quote($domain,'#').'#'; 

Обратите внимание, что вам не нужно скобку вокруг с в HTTPS (если вы не в надежде захватить его)

0

Вам нужно бежать ваши слеша и . в доменном имени

$domain = "stackoverflow.com"; 

$uriToTest = "http://stackoverflow.com/"; 

$escapedDomain = str_replace('.', '\.', $domain); 

$pattern = "/^http(s)?:\/\/(([a-z]+)\.)*".$escapedDomain."/"; 

echo preg_match($pattern, $uriToTest); 
Смежные вопросы