За последние 24 часа нас посетили 15046 программистов и 1767 роботов. Сейчас ищут 1453 программиста ...

Любой URL кроме...

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

  1. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    Я понимаю что это делается просто, но моих мозгов не хватает.
    Есть шаблон, который заменяет сложные ссылки.
    Код (PHP):
    1. /(https?:\/\/)?(www\.)?([-а-яa-zёЁцушщхъфырэчстью0-9_\.]{2,}\.)(рф|[a-z]{2,6})((\/[-а-яёЁцушщхъфырэчстьюa-z0-9_]{1,})?\/?([a-z0-9_-]{2,}\.[a-z]{2,6})?(\?[a-z0-9_]{2,}=[-0-9]{1,})?((\&[a-z0-9_]{2,}=[-0-9]{1,}){1,})?)/i
    Ломаю голову, не могу добавить в этот шаблон домен-исключение.
    Т.е. чтобы отсеивались все сложные ссылки, кроме ссылок в которых доменом выступает, например yandex.ru.

    Код (PHP):
    1. $patterns="/(https?:\/\/)?(www\.)?([-а-яa-zёЁцушщхъфырэчстью0-9_\.]{2,}\.)(рф|[a-z]{2,6})((\/[-а-яёЁцушщхъфырэчстьюa-z0-9_]{1,})?\/?([a-z0-9_-]{2,}\.[a-z]{2,6})?(\?[a-z0-9_]{2,}=[-0-9]{1,})?((\&[a-z0-9_]{2,}=[-0-9]{1,}){1,})?)/i ";
    2. $rеplace="Текст для замены ссылок, кроме ссылок с доменом yandex.ru";
    3. $msg=preg_replace($patterns, $rеplace, $msg);  
    Буду рад любой помощи. Спасибо!

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    А можно отформатировать код? Там переносы табуляция, не хрена ведь не разобрать.

    А что делает [-а-яёЁцушщхъфырэчстьюa-z0-9_] может так проще будет [\wа-я_Ё]
     
  3. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    Да, так будет проще. Вопрос актуальный, как вставить в этот шаблок домен исключение...
     
  4. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    (?!temp) Только не помню поддерживает ли этот флаг php, попробуй.
    (temp){0} Точно заработает.
    [^t][^e][^m][^p] Такое тоже возможно, но не советую так делать.

    Вот тебе пример проверки домена:
    Код (PHP):
    1. (
    2.   # Твоё исключение
    3.   (temp){0}
    4.   # Имя домена
    5.   [\wа-я]{1,63}
    6. )
    7. \.
    8. (рф|[a-z]{2,}) 
     
  5. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    Извини, немного не понял что куда поставить... А можно на моем примере?

    Код (PHP):
    1. $patterns="/(https?:\/\/)?(www\.)?([-а-яa-zёЁцушщхъфырэчстью0-9_\.]{2,}\.)(рф|[a-z]{2,6})((\/[-а-яёЁцушщхъфырэчстьюa-z0-9_]{1,})?\/?([a-z0-9_-]{2,}\.[a-z]{2,6})?(\?[a-z0-9_]{2,}=[-0-9]{1,})?((\&[a-z0-9_]{2,}=[-0-9]{1,}){1,})?)/i ";
    2. $rеplace="Текст для замены ссылок, кроме ссылок с доменом yandex.ru";
    3. $msg=preg_replace($patterns, $rеplace, $msg); 
     
  6. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    Все еще нужно решение)
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Есть пример который можно запустить у себя и посмотреть?
     
  8. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    Да, есть. Вот рабочий код заменяющий все ссылки.
    Код (PHP):
    1. <?php
    2. header("Content-Type: text/html; charset=utf-8");
    3. $msg = "Это тестовый  пример сайта http://example.ru/test/1.jpg в котором нужно заменить ссылку на произвольный текст.<br> Вот этот сайт: www.test.com тоже является примером.<br>Однако ссылка сайта яндекса http://www.yandex.ru/map/map.php является исключением и ее трогать не нужно.<br>";
    4. $patterns="/(https?:\/\/)?(www\.)?([-а-яa-zёЁцушщхъфырэчстью0-9_\.]{2,}\.)(рф|[a-z]{2,6})((\/[-а-яёЁцушщхъфырэчстьюa-z0-9_]{1,})?\/?([a-z0-9_-]{2,}\.[a-z]{2,6})?(\?[a-z0-9_]{2,}=[-0-9]{1,})?((\&[a-z0-9_]{2,}=[-0-9]{1,}){1,})?)/i ";
    5. $rеplace="ТУТ ССЫЛКА И ОНА ЗАМЕНЕНА!";
    6. $msg=preg_replace($patterns, $rеplace, $msg);
    7. print($msg);
    8. ?>
     
  9. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    Нужна помощь!
     
  10. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Так запихай моё решение в свою регулярку. Вот тебе справка по регуляркам http://www.php.su/articles/?cat=regexp&page=008
     
  11. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    Пробовал запихать. Не получилось... Видимо где-то ошибка. Регулярки даются мне тяжко.
     
  12. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Ну раз с регуляторами так тяжко можно так:
    Код (PHP):
    1. if (filter_var($url, FILTER_VALIDATE_URL) !== false && preg_match($url, '/Исключение|Второе исключение/') == false) {
    2.     // OK
    3. } else {
    4.    // EROR
    5. }
    6.  
     
  13. MinusG

    MinusG Новичок

    С нами с:
    9 дек 2015
    Сообщения:
    17
    Симпатии:
    0
    У меня нету $url.
    У меня есть лишь $msg в котором не только ссылки но вперемешку текст знаки препинания и т.д.
    Можно мой пример прям скопировать и туда внедрить исключение?

    Либо может как-то мой шаблон просто подправить?
     
  14. abler98

    abler98 Активный пользователь

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Может просто использовать preg_match_callback?