2013-11-25 2 views
2

Должен признаться, я никогда не привык к использованию регулярных выражений, однако в последнее время я столкнулся с проблемой, когда работа вокруг была бы больнее, чем использование регулярного выражения. Мне нужно уметь сопоставлять все, что следует за следующим рисунком в начале строки: {any_url_safe_word} + ("/http://" || "/https://" || "www.") + {any word}. Так следующее должно соответствовать:Соответствие определенным словам регулярных выражений в url

  • cars/http://google.com#test
  • cars/https://google.com#test
  • cars/www.google.com#test

follwing не должны совпадать:

  • cars/httdp://google.com#test
  • cars/http:/google.com#test

То, что я пытался до сих пор: ^[\w]{1,500}\/[(http\:\/\/)|(https:\/\/])|([www\.])]{0,50}, но это соответствует cars/http от cars/httpd://google.com.

+0

Что это: {any_url_safe_word}? – user4035

+0

например: автомобили, ca_rs, ca_1_rs и т. Д. Не «c a r s». – Babiker

ответ

0
<?php 
$words = array(
    'cars/http://google.com#test', 
    'cars/https://google.com#test', 
    'cars/www.google.com#test', 
    'cars/httdp://google.com#test', 
    'cars/http:/google.com#test', 
    'c a r s/http:/google.com#test' 
    ); 

foreach($words as $value) 
{ 
    /* 
     \S+   - at least one non-space symbol 
     \/   - slash 
     (https?:\/\/) - http with possible s then :// 
     |    - or 
     (www\.)  - www. 
     .+   - at least one symbol 
    */ 
    if (preg_match('/^\S+\/(https?:\/\/)|(www\.).+/', $value)) 
    { 
     print $value. " good\n"; 
    } 
    else 
    { 
     print $value. " bad\n"; 
    } 
} 

Печать:

cars/http://google.com#test good 
cars/https://google.com#test good 
cars/www.google.com#test good 
cars/httdp://google.com#test bad 
cars/http:/google.com#test bad 
c a r s/http:/google.com#test bad 
3

Это регулярное выражение может сделать:

^[\w\d]+\/(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3} 

И если вы хотите, чтобы получить все, что происходит после этого, вы можете просто добавить (.*) до конца .. .

Live DEMO

enter image description here

И так как кажется, что более или менее общий список URL безопасных слов содержит ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~:/?#[]@!$&'()*+,;=Source, вы можете включить это тоже, так что вы получите (после упрощения):

^[!#$&-.0-;=?-\[\]_a-z~]+\/(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3} 
+0

Не совсем так: хорошее регулярное выражение, только для соответствия шаблону имени домена, от http://hexillion.com/samples/ будет '^ (?: [A-zA-Z0-9] (?: [A- Za-z0-9 \ -]) {0,61} [A-Za-Z0-9] \) * [A-Za-Z0-9] ((\?!.):.? [A-Za -Z0-9 \ -] (?! $)) {0,61} [a-zA-Z0-9]? $ ' – CD001

+0

Правда, сопоставление шаблона домена очень сложное, я просто выбрал простейшую версию, которая соответствует его (надеюсь, так) – Enissay

+0

Хе-хе, отбросьте '\ w \ d ...' для вашего разрешенного списка символов в '[...]', и вы должны быть хорошими, я думаю. – CD001

0

Проверьте demo.

[a-z0-9-_.~]+/(https?://|www\.)[a-z0-9]+\.[a-z]{2,6}([/?#a-z0-9-_.~])*

Edit: принято @ CD001 комментариев во внимание. Обязательно используйте модификатор i, если вы не против чувствительности к регистру.

+0

Проблема с использованием '\ w' заключается в том, что он соответствует любому символу слова« Perl »и который изменяется в зависимости от языка, в котором работает PHP, - технически вы будете сопоставлять символы, такие как« ... », которые не ** действительные символы URL (пока). – CD001

Смежные вопросы