Чтение записей с шаблоном-разделителем

Задача
Необходимо прочитать записи из файла, в котором каждая запись отделена шаблоном, который можно сопоставить с регулярным выражением.

Решение
Прочитайте весь файл в строку, а затем выделите из нее регулярное выражение:

$filename = '/path/to/your/file.txt';
$fh = fopen($filename, 'r') or die($php_errormsg);
$contents = fread($fh, filesize($filename));fclose($fh);
$records = preg_split('/[0-9]+\) /', $contents);

Обсуждение
Этот пример разделяет нумерованный список на части и помещает отдельные элементы списка в элементы массива. Поэтому если есть такой список:

1) Go
..
del
2) Escher
3) Bach

то в результате работы примера получается массив из четырех элементов с пустым первым элементом. Дело в том, что функция preg_split() предполагает наличие разделителей между элементами, но в данном случае элементы предваряются числами:

Array
(
[0] =>
[1] => Go
..
del
[2] => Escher
[3] => Bach
)

Это можно рассматривать как дополнительную функциональность, а не как ошибку, поскольку теперь n-й элемент массива содержит n-й элемент списка.


Но чтобы сделать массив более компактным, можно удалить первый элемент:

$records = preg_split('/[0-9]+\) /', $contents);
array_shift($records);

Можно также выполнить другое преобразование, а именно удалить из всех элементов символ новой строки и заменить его пустой строкой:

$records = preg_split('/[0-9]+\) /', str_replace("\n",'',$contents));
array_shift($records);

PHP не позволяет изменить при вводе записей разделитель на что-нибудь другое, кроме символа новой строки, поэтому данный прием также полезен при поиске отдельных записей, разделенных переводами строки. Однако если вы просто разделяете записи внутри одной строки, то следует предпочесть более эффективную функцию explode(), а не
preg_split().

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Выбор между поглощающим и непоглощающим сравнением
Нахождение n-го совпадения
Переход от ereg к preg
Поиск в файле всех строк, соответствующих шаблону
Поиск слов

Вернуться в раздел: PHP / 13. Регулярные выражения