PHP в деталях

       

Структура


Сейчас будет сложное описание, мне оно и самому не нравится.

Эта вещь необходима для сложных запросов. Например, вам надо, чтобы в тексте были либо только маленькие буквы, либо только большие, либо только цифры. Класс символов "[a-zA-Z0-9]" не подходит. Тогда пишем такое:

if (ereg("[a-z]+|[A-Z]+|[0-9]+", $text)) ...

Вертикальная черта? знак "или" регулярных выражений (знака "и", естественно, не существует ? это и есть само регулярное выражение). Разделенные вертикальной чертой шаблоны в официальной документации называются альтернативными ветвями (это подразумевает ветвление, т.е. наличие вложенных альтернативных ветвей). Программа сравнивает со строкой все ветви (проходясь по их ряду слева направо), до первого совпадения (это важно учесть, если у вас сложное выражение со вложенными ветвями). Для разделения уровней и отделения этого дерева альтернатив от остального шаблона используются обычные скобки. Если те же большие/маленькие буквы/цифры надо искать внутри контейнера тегов:

if (ereg("<tag>([a-z]+|[A-Z]+|[0-9]+)</tag>", $text)) ...

Из сложного это, кажется, все. Теперь о более простом. Скобки по-научному называются subpattern (вложенный шаблон). И используются не только для сложных вариантов шаблонов, но и для гибкой замены фрагментов текста или получения их в переменную. К примеру, для печатной версии текста дублируем адреса ссылок текстом в скобках:

ereg_replace("<a href=([^>]+)>[^<]+</a>", "\\0 [\\1]", $text);

Первые скобки ? первый вложенный шаблон ? можно получить "на выходе" через обозначение "\n" (поскольку обратный слэш в php и многих других языках используется для спецсимволов, надо поставить перед ним еще один такой же, чтобы прогамма понимала его буквально). Под нулевым номером ? вся совпавшая строка. У себя в печатной версии статьи я не пишу ссылки сразу в тексте, а делаю их список в конце примерно так:


if (ereg("<a href=([^>]+)>([^<]+)</a>", $text, $match)) {

  for ($a=0;$a<sizeof($match[0]);$a++) {

    $b = $a+1;

    $text = str_replace($match[0][$a], $match[0][$a]." [$b]", $text);



    $match[1][$a] = "$b) ". $match[1][$a];

    };

  $text .= "<br><h2>Ссылки, использованные в выпуске:</h2>". implode("<br>", $match[1]);

  };

Функция ereg (и eregi), если ей указать в третьем параметре переменную, то туда будут записаны все подстроки в виде .

Это, собственно, все. Дальше нужно только уметь составлять шаблоны. Приведу несколько примеров.

1. (как я уже отметил, Apache работает со стандартом POSIX).

2. : из пользовательского поискового запроса делается sql-запрос. Если отбросить создание статистики поиска (сколько найдено всего, сколько по каждому слову), то получится, что необходимо всего 6-7 строк кода. Там же описана и подсветка слов в результатах поиска. Кстати, важное замечание: перед тем, как вырезать короткие слова из строки я заменяю пробелы между словами на двойные. Почему? Потому что совпадающие с шаблоном строки не должны наезжать друг на друга.

Объясню подробнее. Если в шаблоне нет никаких якорей, система проходится по тексту слева направо, и если найдено совпадение, кидает его в какие-то переменные, а затем перескакивает на следующий символ после совпавшего фрагмента. Мы ищем по шаблону "пробел, два непробела, пробел", а пробелы одиночные. Программа находит "пробел-короткое слово-пробел", заменяет это на один пробел, а затем перескакивает на... первую букву следующего слова. Это не пробел, поэтому даже если следующее слово тоже короткое, оно под шаблон не подойдет. Поэтому-то и надо предварительно заменить пробелы на двойные.

3. Как хранить новости в файлах и не бегать циклом по дате:

$handle=opendir($newsdir);

while ($file = readdir($handle)) {

  if (is_file($file) && ereg("^[0-9]{6}\.txt\$", $file))

    print ("<p align=justify><b>". ereg_replace("^([0-9]{2})([0-9]{2})([0-9]{2})\.txt\$", "\\1.\\2.20\\3", $file). "</b> ". implode("", file($file)). "</p>");

closedir($handle);

4. Проверка правильного написания email-а:

if (!eregi("^[a-z0-9\._-]+@[a-z0-9\._-]+\.[a-z]{2,4}\$", $email))

  print("Bad email: \"$email\"");

На этом все. В следующем выпуске ? стандарт PCRE, точнее дополнительные возможности, которые он предоставляет.


Содержание раздела