Исправить выражение

Тема в разделе "Регулярные выражения", создана пользователем Rigor, 23 авг 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Rigor

    Rigor

    Регистр.:
    1 июн 2008
    Сообщения:
    202
    Симпатии:
    33
    Сколько не читал мануалов никак не могу въехать в эти РВ. Вот, например, простейший пример - нужно составить регулярку URL

    Я сделал так:

    preg_match("/(http://)|(www)[A-Za-z0-9-]+/.[A-Za-z0-9/-]+(/.[A-Za-z0-9/-]+)/"

    Бред конечно. Ткните носом плз, что и на что нужно исправить. И почему. А то задолбался уже. Заранее спасибо
     
  2. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    www если идет то всегда после него стоит точно

    это как понимать? экранирование? )

    + в урле еще могут быть & ? # % символы

    / лишняя


    а вообще давайте пример урла, который хотите распознать регуляркой, поможем
     
    Rigor нравится это.
  3. Rigor

    Rigor

    Регистр.:
    1 июн 2008
    Сообщения:
    202
    Симпатии:
    33
    Любые url. Чтобы пропускал любые возможные виды. Т.е. с шттп, www. И стем и с другим. 2, 3 уровня.

    Спасибо за помощь)
     
  4. serrgo

    serrgo

    Регистр.:
    13 авг 2006
    Сообщения:
    158
    Симпатии:
    77
    \b(https?|ftp|file:(//[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]
     
  5. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217

    А не дофига ли ты символов разрешил в урле?
     
  6. Rigor

    Rigor

    Регистр.:
    1 июн 2008
    Сообщения:
    202
    Симпатии:
    33
    serrgo

    Ошибка высветилась:
    Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in Z:\home\plan.ru\www\users\settings.php on line 41
     
  7. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Скинь полную регулярку
     
  8. Dudarik

    Dudarik Писатель

    Регистр.:
    18 авг 2009
    Сообщения:
    3
    Симпатии:
    0
    Как вариант:
    PHP:
    function hrefCallback($p)
     {
       
    $name=htmlspecialchars($p[0]);
       
    $href=!empty($p[1])?$name:"http://$name";
       return 
    "<a href=\"$href\">$name</a>";
     }
     function 
    hrefActivate($str)
     {
        return 
    preg_replace_callback(
        
    '{
          (?:
           (\w+://)                  # Протокол с двумя слэшами
           |                         # - или -
           www\.                     # просто начинается с www
          )
          [\w-]+(\.[\w-]+)*          # имя хоста
          (?: : \d+)?                # порт не обязательно
          [^<>"\'()\[\]\s]*          # URI без кавычек и скобок
          (?:                        # Последний символ быть...
              (?<! [[:punct:]])      # не пунктуацией
             |(?<= [-/&+*])          # но допустимо окончание на -/&+*
          )
        }xis'
    ,
        
    "hrefCallback",
        
    $str
        
    );
     }
     
    $text='У нас есть ссылки вот такие:(http://site.ru), www.site?a=b , http://site.net. www.site.ru:80';
     echo 
    hrefActivate($text);
     
  9. Rigor

    Rigor

    Регистр.:
    1 июн 2008
    Сообщения:
    202
    Симпатии:
    33
    tostrss

    Код:
    if(!preg_match("\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]", $_POST['blog']))
        {
    Dudarik

    Спасибо, но нужна именно регулярка...
     
  10. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Не уверен в правильности выше приведенной регулярки.., но код будет таким
    PHP:
    if(!preg_match('%\b(https?|ftp|file)://[-A-Z0-9+&@#/\%?=~_|!:,.;]*[-A-Z0-9+&@#/\%=~_|]%i'$_POST['blog']))
    если переменная $_POST['blog'] должна содержать только ссылку, без текста, я бы посоветовал такую регулярку
    PHP:
    if(!preg_match('%^https?://(www\.)?[a-z0-9-.]+[a-z0-9.?/&=\%#_-]*$%iD'$_POST['blog']))
    Здесь более жесткое условие и не включены символы :,;!~| имхо, они не нужны.
     
Статус темы:
Закрыта.