Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
 out. 
Проблема довольно тривиальна, и даже на PHP ее можно решить всего несколькими 
командами. Например, так: 
$p=strrpos($inFile,'.'); 
if($p) $outFile=substr($inFile,0,$p); else $outFile=$inFile; 
$outFile.=".out"; 
На самом деле, выглядит довольно неуклюже (особенно из-за того, что приходится 
обрабатывать случаи, когда входной файл не имеет расширения, а значит, в нем 
нет 
точки). И эта "навороченность" имеет место, несмотря на то, что само действие 
при- 
веденных строк можно описать всего несколькими словами. А именно: "Замени в 

Глава 22. Основы регулярных выражений в формате RegEx 297 
строке $inFile все, что после последней точки (и ее саму), или, в крайнем 
случае, 
"конец строки" на строку .out, и присвой это переменной $outFile". 
Пример второй 
Давайте теперь рассмотрим другой пример. Нам нужно разбить полное имя файла на 
две составляющие: каталог, в котором расположен файл, и само имя файла. Как мы 
знаем, для этого в PHP встроены функции basename() и dirname(), рассмотренные 
выше. Но предположим для тренировки, что их нет. Вот как мы реализуем требуемые 

действия: 
$slash1=strrpos($fullPath,'/'); 
$slash2=strrpos($fullPath,'\\'); 
$slash=max($slash1,$slash2); 
$dirName=substr($fullPath,0,$slash); 
$fileName=substr($fullPath,$slash+1,10000); 
Здесь мы воспользовались тем фактом, что strrpos() возвращает false, которое 
интерпретируется как 0, если искомый символ не найден. Обратите внимание на то, 

что пришлось два раза вызывать strrpos(), потому что мы не знаем, какой слэш 
будет получен от пользователя — прямой или обратный. Видите — код все увеличи- 
вается. И уменьшить его почти невозможно. 
На самом деле, эта проблема выглядит немного надуманной. Куда как проще 
и, главное, надежнее было бы сначала заменить в строке все обратные слэши 
на прямые, а потом и искать только прямые. Но в данном случае такой прием 
несколько отдалил бы нас от техники регулярных выражений, которой и по- 
священа глава. 
Опять же, сформулируем словами то, что нам нужно: "Часть слова после последнего 

прямого или обратного слэша или, в крайнем случае, после начала строки, присвой 

переменной $fileName, а "начало строки" — переменной $dirName". Формулиров- 
ку "часть слова после последнего слэша" можно заменить на несколько другую: 
"Часть слова, перед которой стоит слэш, но в нем самом слэша нет". 
Выводы 
Скорее всего, вы уже поняли, что основной акцент в этих примерах я старался 
делать 
не на алгоритмах, а на "словесных утверждениях". Они состояли из довольно не- 
сложных, но комплексных частей, относящихся не к одному символу (как это про- 
изошло бы, организуй мы цикл по строке), а сразу к нескольким "похожим"... 

Часть IV. Стандартные функции PHP 298 
Но вернемся к названию этой главы. Так что же такое регулярные выражения? Ока- 
зывается, наши словесные утверждения (но не инструкции замены, а только правила 

поиска), записанные на особом языке, — это и есть регулярные выражения. 
Терминология 
Ну вот, к этому моменту должно быть уже интуитивно понятно, для чего же нужны 
регулярные выражения. Настало время посмотреть, как же их перевести на язык, 
по- 
нятный PHP. 
Давайте немного поговорим о терминологии. Вернемся к нашим двум примерам, 
только назовем теперь то, что мы раньше называли "словесным утверждением", 
регу- 
лярным выражением, или просто выражением. В литературе иногда для этого же 
употребляется термин "шаблон", но мне он не особенно нравится, поэтому все-таки 

остановимся на слове "выражение". 
Итак, мы имеем выражение и мы имеем строку. Операцию проверки, удовлетворяет 
ли строка этому выражению (или выражение — строке, как хотите) условимся назы- 
вать сопоставлением строки и выражения. Если какая-то часть строки успешно со- 
поставилась с выражением, мы назовем это совпадением. Например, совпадением от 
сопоставления выражения "группа букв, окруженная пробелами" к строке "ab cde 
fgh" 
будет строка "cde" (ведь только она удовлетворяет нашему выражению). Возможно, 
дальше мы с этим совпадением захотим что-то продел
 
<<-[Весь Текст]
Страница: из 287
 <<-