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, точнее дополнительные возможности, которые он предоставляет.