А теперь перейдем к жизненным примерам использования регулярных выражений, то что может непосредственно пригодится при разработке веб-приложений..
1. Разбивка файла на строки..
Суть задачи думаю ясна.. тут можно воспользоваться встроеной функцией file(...) или же, прочитав все данные в строку, воспользоваться explode("\n", ...)..
Да, можно... вот только file(...) возвращает массив строк, сохраняя в конце строк переход на другую строку (\n или \r\n).. а использование explode("\n", ...) немногим лучше, так как если в файле разделитель строк в стиле dos (\r\n), то в конце разбитых строк остается символ \r.. к тому же оба эти способа для пустых строк возвратят такие же пустые элементы массива -- а оно нам нужно?
Как же быть?.. все просто.. читаем содержимое файла в буфер и разбиваем на части, используя регулярное выражение..
$A = file_get_contents(имя_файла);
$R = preg_split("/\r?\n/", $A, -1, PREG_SPLIT_NO_EMPTY);
Данный метод разбивает файл на строки как по символу \n (unix формат), так и по \r\n (dos формат)... пустые строки при этом игнорируются..
В принципе можно немного видоизменить паттерн, чтобы разбивка шла и по символу \r (mac os формат):
$A = file_get_contents(имя_файла);
$R = preg_split("/[\r\n]+/", $A, -1, PREG_SPLIT_NO_EMPTY);
2. Удаление лишних пробелов из строки..
Суть задачи состоит в том, чтобы заменить несколько подряд идущих пробелов в строке одним пробелом..
Если честно, не представляю себе других тривиальных способов сделать такое, кроме как удалять в цикле парные пробелы, пока не останутся лишь одиночные.. но это извращенство еще то.. :-)
Куда проще воспользоваться регулярным выражением:
$R = preg_replace("/\s+/", " ", $A);
все подряд идущие пробелы, табуляции, переходы на другую строку заменяются на один пробел..
3. Удаление html-тегов из текста или потока ввода..
А вот эта на первый взгляд простая задача может породить регулярные выражения длиной с пол-страницы.. :-)
Решений задачи множество.. каждое из них верно только в определенных условиях..
Самое простое решение, это удаление от < до >:
$R = preg_replace("/<\/?[a-z][\w\-\.:]*[^>]*>/", "", $A);
В чем подводные камни, спросите вы? в том что:
— контент внутри тегов <head></head>, <style></style>, <script></script> совсем нам не нужен, а при использовании вышеописанного выражения он будет сохранен..
— контент внутри таблиц <table></table> при простом удалении тегов сольется воедино, что не совсем хотелось бы..
— не обрабатываются специальные теги xml, такие как: prolog, doctype, entity, element, attlist, notation, processing instructions, cdata.. конечно, если вы не разбираете xml документы обработка этих тегов совсем не нужна, ну а вдруг?..