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

Статус
В этой теме нельзя размещать новые ответы.

xpert13

<(*_*)>
Регистрация
7 Ноя 2008
Сообщения
182
Реакции
469
Особенности данной темы
В этой теме описаны решения популярных проблем в парсинге, замене текстов и т.д. Другими словами то, с чем прекрасно справляются регулярные выражения. Тема расчитана на новичков, тех кто плохо разбирается в регулярных выражениях и тех, кто в них вообше не разбирается, но нуждается в решении простой задачи.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

11. Дата в формате YYYY-MM-DD
[spoil][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)[/spoil]

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

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

14. UUID
[spoil]^[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}$[/spoil]

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

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

17. URL на латинице
[spoil]
Код:
~^(?:(?: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» и добавить в список доменных зон «рф»
[/spoil]

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

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

Часть информации по валлидации взята из этой статьи Для просмотра ссылки Войди или Зарегистрируйся (спасибо Для просмотра ссылки Войди или Зарегистрируйся)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху