Регулярные выражения помогают нам быстро находить различные ошибки в коде сайта.
Хочется сказать, что написать совершенный паттэрн, наверное, невозможно. Совершенный паттэрн должен был бы в один приём уметь:
- Обнаруживать двойное использование атрибутов тэга
- Определять пропущенные обязательные атрибуты
- Определять неверный формат тэга, например использование двойных кавычек внутри атрибута без экранирования
- Проверять тэги без пробелов между атрибутами
- Корректно определять атрибут на нестандартном месте, например <a title="blabla" href="blabla.htm">
- и др.
В итоге нам приходится делать 5-20 проверок базы данных целого сайта по разным паттэрнам в поисках ошибок.
\<a\shref\=\"[^"]+\"\>
- Поиск ссылок без тэга title.\<img\s(src\=\"[^"]*\")+\s?((alt\=\"[^"]*\")+|(title\=\"[^"]*\")+)?\s*\/?\>
- Поиск изображений либо вообще без тэгов alt,title, либо без одного из этих тэгов.
Разбираем тему по кусочкам
Паттерн | Что обозначает | Пример |
\<img(?=[^>]*src)(?=[^>]*title\=\"|alt\=\").*?\> | Картинка, включающая и title и alt, а также возможны любые другие атрибуты | <img src="#" alt="asdas" title="wqeeq" class="qwewqe" /> |
\<(?:img|a)[^\>]+?(?=(alt|title)\=\"[^\>]+\1\=\").*?\> | Ищем картинку или ссылку с повторяющимися атрибутами | <img src="#" title="атрибут тайтл" title="он же ещё раз" alt="qew"> |
^(.+)\1$ | Удаляет повторяющиеся слова в одной строке. Например, IP&IIP&I, в итоге должно остаться IP&I. \1 Означает вхождение первого найденного паттерна. | Не забываем в результат поставить $1 |
^(.+)\1(\d.*)$ | Удаляет один из дублей в строке, если в конце есть например цифра и разная фигня. | Не забываем в результат поставить $1$2 |