Самые популярные проблемы и их решения

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

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

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Особенности данной темы
    В этой теме описаны решения популярных проблем в парсинге, замене текстов и т.д. Другими словами то, с чем прекрасно справляются регулярные выражения. Тема расчитана на новичков, тех кто плохо разбирается в регулярных выражениях и тех, кто в них вообше не разбирается, но нуждается в решении простой задачи.

    Так как регулярные выражения используются в разных языках программирования и разных редакторах по разному, в этой теме будет использоваться самый популярный синтаксис - PERL.

    Как использовать эти выражения в PHP
    Регулярное выражение надо поместить между парных символов... Символ (обычно "/") : любой символ, кроме букв, цифр и пропусков (пробел, перевод каретки и т.д.). Желательно (надо так выбрать), чтобы этот символ не встречался в самом регулярном выражении, иначе его придется слешить.

    Пример 1: /<img\s+[^>]*>/i
    Пример 2 (если в регулярном выражении есть символ "/") : #<a\s+[^>]*>(.*?)</a>#i

    Как вы возможно заметили, в конце каждого выражения есть буква "i", это модификатор регулярного выражения (именно ради того, чтобы отделить регулярное выражения и модификаторы и необходимо обрамление парными символами) который указывает на то, что регулярное выражение будет регистронезависимым


    Как использовать эти выражения в notepad++
    Тут еще проще чем в PHP, единственное отличие от Перла в том, что при замене группы указываются не со знаком доллара ($), а со слешем, например было так "$1", а в notepad++ нужно так "\1"


    I. Удаление из текста

    1. Удалить все ссылки
    Найти: <a\s+[^>]*>(.*?)</a>
    Заменить на: $1


    2. Удалить все картинки
    Найти: <img\s+[^>]*>
    Заменить на:


    3. Заключить в noindex и nofollow ссылки в тексте
    Найти: <a\s+([^>]+)>([^<]*)</a>
    Заменить на: <noindex><a $1 rel="nofollow">$2</a></noindex>

    Примечание: Регулярка не проверяет наличие noindex и nofollow в тексте, потому запускать её можно только для текстов, где гарантировано нету этих тегов


    4. Добавить тег <br /> после каждого абзаца
    Найти: ([\n\r]+)
    Заменить на: <br />$1


    5. Как убирать дату вида: XX.XX.XXXX
    Найти (вариант 1): \d{2}\.\d{2}\.\d{4}
    Найти (вариант 2): \d{1,2}\.\d{1,2}\.\d{4}
    Заменить на:

    Примечание: вариант 1 используется когда все даты имеют строгий формат - 2 цифры дня, 2 цифры месяца и 4 года, а вариант 2 - когда день и месяц могут быть одноциферными


    6. Убрать из тега <img> все атрибуты кроме "src"
    Найти: <img\s+[^>]*(src=['"][^'^"]*['"])[^>]*>
    Заменить на: <img $1 />


    7. Убрать пустые строки в тексте
    Найти: [\r\n]+
    Заменить на: \r\n

    Примечание: в зависимости от операционной системы, в заменить нужно вписывать разные значения. Для Windows ОС это "\r\n", для Unix "\n", для Mac "\r". Если вы сделаете не верный выбор, то в зависимости от ОС либо не увидите вообще переносов, либо увидите лишние переносы. В этом случае поможет повторный запуск регулярки только уже с другим значением параметра "Заменить на"


    8. Удалить все атрибуты тега
    Найти: <(ИМЯ_ТЕГА)\s[^>]+>
    Заменить на: <$1>

    Примечание: ИМЯ_ТЕГА необходимо заменить на имя вашего тега, параметры которого хотите очистить. Например: "<(div)\s[^>]+>". Допускаются так же конструкции перебора, которые позволяют с помощью одного регулярного выражения очистить несколько видов тегов, например: "<(div|p|strong)\s[^>]+>"


    9. Удалить весь текст до определенного слова, после определенного слова и между словами
    Найти (до слова): [\W\w]*(СЛОВО)
    Найти (после слова): (СЛОВО)[\W\w]*
    Заменить на: $1

    Найти (между словами): (СЛОВО1)[\W\w]*(СЛОВО2)
    Заменить на: $1$2

    Примечание: СЛОВО (СЛОВО1 и СЛОВО2) необходимо заменит на нужные вам слова (или даже словосочетания). В зависимости от того, нужно вам после удаления оставлять эти слова корректируйте значение "Заменить на" (заполняйте как я если нужно, либо оставьте пустым если не нужно)


    10. Как заключить картинки в <div style="text-align:center">...</div>
    Найти: (<img\s+[^>]*>)
    Заменить на: <div style="text-align:center">$1</div>


    11. Удалить определенное количество первых строк
    Найти: ([^\r\n]+[\r\n]+){КОЛИЧЕСТВО}(.*)
    Заменить на: $2

    Примечание: КОЛИЧЕСТВО необходимо заменить на нужное вам число строк, которое необходимо удалить


    II. Поиск текста (парсинг)

    1. Получить текст между определенными тегами
    Найти: <(ИМЯ_ТЕГА)>(.*?)</\1>

    Примечание: ИМЯ_ТЕГА необходимо заменить на нужное вам имя. Результат будет хранится во второй группе


    2. Получить все ссылки (адрес ссылки и анкор)
    Найти: <a\s+[^>]*href=['"]([^'^"]+)['"][^>]*>(.*?)</a>

    Примечание: адрес ссылки будет в первой группе, а анкор во второй


    3. Получить все адреса картинок
    Найти: <img\s+[^>]*src=['"]([^'^"]+)['"][^>]*>

    Примечание: адрес картинки будет в первой группе


    III. Валидация распространенных видов данных

    1. Номер кредитки
    [0-9]{13,16}


    2. ICQ
    ([1-9])+(?:-?\d){4,}


    3. Набор из букв и цифр (латиница)
    ^[a-zA-Z0-9]+$


    4. Набор из букв и цифр (латиница + кириллица)
    ^[а-яА-ЯёЁa-zA-Z0-9]+$


    5. Домен (например abcd.com)
    ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$


    6. IPv4
    ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)


    7. IPv6
    Код:
    ((^|:)([0-9a-fA-F]{0,4})){1,8}$


    8. Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, первый символ обязательно буква)
    ^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$


    9. Пароль (Строчные и прописные латинские буквы, цифры)
    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$


    10. Пароль (Строчные и прописные латинские буквы, цифры, спецсимволы. Минимум 8 символов)
    (?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$


    11. Дата в формате YYYY-MM-DD
    [0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])

    Более строгая проверка, предложенная runcore:
    (19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)


    12. Дата в формате DD/MM/YYYY
    (0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d


    13. Целые числа и числа с плавающей точкой (разделитель точка)
    \-?\d+(\.\d{0,})?


    14. UUID
    ^[0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}$


    15. Широта или долгота
    -?\d{1,3}\.\d+


    16. E-mail
    ^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$


    17. URL на латинице
    Код:
    ~^(?:(?:https?|ftp|telnet:(//(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&?+=\~/-]*)?(?:#[^ '\"&]*)?$~i
    Примечание: Если нужно распознавать и кириллические домены, необходимо изменить все «a-z0-9» на «а-яёa-z0-9» и добавить в список доменных зон «рф»


    18. Время в формате HH:MM:SS
    Код:
    ^([0-1]\d|2[0-3]:()[0-5]\d){2}$


    19. Mac-адрес
    Код:
    ([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}


    Часть информации по валлидации взята из этой статьи http://habrahabr.ru/post/123845/ (спасибо Extalionez)
     
    Grigirij, Denixxx, Asin и 10 другим нравится это.
Статус темы:
Закрыта.