Консультация № 85738
06.05.2007, 18:21
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты!

Можно ли подсказать решение(если оно конечно есть) для такой задачи.
Имеется текстовый файл, состоящий из нескольких заголовков, и текста между ними. Я составил два шаблона регулярных выражений: один выбирает заголовки, второй выбирает тексты.
Вопрос такой: как можно средствами php, вывести содержимое файла в соответствии с первоначальной последовательностью:
Заголовок
Текст...
Заголовок
Текст...и т.д.
С заголовками более менее понятно, они после прохода по файлу шаблоном регулярного выражения, представляют из себя простой массив типа: array("Заголовок1","Заголовок2",...); Сложнее с массивом текста, он примерно такой array(array("Строка1","Строка2",..),array("Строка1","Строка2",..));

Заранее благодарю за подсказку.

Обсуждение

Неизвестный
09.05.2007, 09:14
общий
это ответ
Здравствуйте, Yugin!
Начиная с PHP 4.3.0 в preg_match_all доступен флаг PREG_OFFSET_CAPTURE, он позволяет получать смещение найденой подстроки от начала текста(структура $matches становится немного другая). И если сравнивать смещения заголовков и строк, мы можем определить когда необходимо выводить следующий заголовок.
см пример, немного не ловкий, но работает.

Успехов.


Приложение:
//какой-то текст из файла$file=<<<EOTЗаголовок1Имя11, фамилия11, отчество11, телефон11, адрес11Имя12, фамилия12, отчество12, телефон12, адрес12Имя13, фамилия13, отчество13, телефон13, адрес13Заголовок2Имя21, фамилия21, отчество21, телефон21, адрес21Имя22, фамилия22, отчество22, телефон22, адрес22Заголовок3Имя31, фамилия31, отчество31, телефон31, адрес31Имя32, фамилия32, отчество32, телефон32, адрес32Имя33, фамилия33, отчество33, телефон33, адрес33Заголовок4Заголовок5Имя51, фамилия51, отчество51, телефон51, адрес51EOT;//шаблон для заголовка, сделалал под примерpreg_match_all("/Заголовок\d/i",$file,$headers,PREG_SET_ORDER+PREG_OFFSET_CAPTURE);//print_r($headers) //шаблон для текста, где каждая строка, как Вы понимаете, будет массивом более мелких элементов //"/(Имя),(фамилия),(отчество),(телефон).../"preg_match_all("/(Имя\d\d), (фамилия\d\d), (отчество\d\d), (телефон\d\d), (адрес\d\d)/i",$file,$strings,PREG_SET_ORDER+PREG_OFFSET_CAPTURE);$s=0; //номер следующей строки$str=$strings[0];//следующая строкаecho ‘<table border=1>‘;//выводим по порядку headers, сравнивая их смещения со строками//если смещение следующей строки меньше смещения текущего заголовка(строка находится выше), то выводим ее и переходим на следующую строкуfor($i=0;$i<count($headers);$i++){ $head=$headers[$i]; //$str[0][1] - смещение строки //$head[0][1] - смещение h-го заголовка while($str && $str[0][1]<$head[0][1]){ //выводим строку echo ‘<tr>‘; for($j=1;$j<=5;$j++){ echo ‘<td>‘.htmlspecialchars($str[$j][0]).‘</td>‘; } echo ‘</tr>‘; //на следующую строку $str=@$strings[++$s]; } //выводим зоголовок echo ‘<tr><th colspan=5>‘.htmlspecialchars($head[0][0]).‘</th></tr>‘;} //после последнего заголовка могут быть строки, выводим их while($str){ //выводим строку echo ‘<tr>‘; for($j=1;$j<=5;$j++){ echo ‘<td>‘.htmlspecialchars($str[$j][0]).‘</td>‘; } echo ‘</tr>‘; $str=@$strings[++$s]; }echo ‘</table>‘;
Форма ответа