Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разбить строку в массив
 
 автор: Лена   (21.07.2008 в 10:10)   письмо автору
 
 

Есть вот такой текст:

20.07.2008 10:35<a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/"></a><a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/">Немцы строят мечети!</a>Во время первого визита немецкого канцлера Ангелы Меркель в африканскую страну был подписан крупный контракт на строительство немецкими компаниями третьей по величине мечети в мире. 20.07.2008 10:26<a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_k_evro2012_obespechen/"></a><a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_k_evro2012_obespechen/">Рост количества гостиниц к ЕВРО-2012 обеспечен?</a>Для успешного проведения финала Чемпионата Евро-2012 столица Украины должна подготовить дополнительно 200 тыс. мест для приема гостей чемпионата. Именно поэтому строительство отелей сегодня приобрело особую популярность. 20.07.2008 10:14<a href="/hotnews/2008/07/18/yujnyy_bereg_kryma_mojet_lishitsja_statusa_kurorta/"></a><a href="/hotnews/2008/07/18/yujnyy_bereg_kryma_mojet_lishitsja_statusa_kurorta/">Южный берег Крыма может лишиться статуса курорта</a>Под видом отелей и санаториев в Крыму строят частное жильё. Это превращает курорт в перенаселённую и шумную агломерацию.

В тексте каждый блок материала начинается с даты (20.07.2008). Таких блоков много.
Как этот текст разбить на массив? При этом все должно остаться на своих местах.

   
 
 автор: cheops   (22.07.2008 в 02:48)   письмо автору
 
   для: Лена   (21.07.2008 в 10:10)
 

Что должен содержать элемент массива и каков должен быть его индекс/ключ?

   
 
 автор: Лена   (22.07.2008 в 10:10)   письмо автору
 
   для: cheops   (22.07.2008 в 02:48)
 

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

20.07.2008 10:35<a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/"></a><a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/">Немцы строят мечети!</a>Во время первого визита немецкого канцлера Ангелы Меркель в африканскую страну был подписан крупный контракт на строительство немецкими компаниями третьей по величине мечети в мире.

Первый элемент массива будет вот такой:

20.07.2008 10:26<a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_k_evro2012_obespechen/"></a><a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_k_evro2012_obespechen/">Рост количества гостиниц к ЕВРО-2012 обеспечен?</a>Для успешного проведения финала Чемпионата Евро-2012 столица Украины должна подготовить дополнительно 200 тыс. мест для приема гостей чемпионата. Именно поэтому строительство отелей сегодня приобрело особую популярность.

Второй элемент массива:

20.07.2008 10:14<a href="/hotnews/2008/07/18/yujnyy_bereg_kryma_mojet_lishitsja_statusa_kurorta/"></a><a href="/hotnews/2008/07/18/yujnyy_bereg_kryma_mojet_lishitsja_statusa_kurorta/">Южный берег Крыма может лишиться статуса курорта</a>Под видом отелей и санаториев в Крыму строят частное жильё. Это превращает курорт в перенаселённую и шумную агломерацию.

Ну и так дальше. Ключ массива - целое число.

Я пробовала разбить текст с помощью регулярных выражений, вот так:

$block = preg_split("#[\d]{2}\.[\d]{2}\.[\d]{4}\s+[\d]{2}:[\d]{2}#", $text, -1, PREG_SPLIT_NO_EMPTY);


Получилось. Только дата тогда вырезается. Как можно сделать так, чтобы дата сохранилась? И еще один вопрос: можно ли здесь обойтись без регулярных выражений?

   
 
 автор: cheops   (22.07.2008 в 12:04)   письмо автору
 
   для: Лена   (22.07.2008 в 10:10)
 

К сожалению удалось вытащить все элементы кроме последнего, нужно подумать, как извлечь последний элемент, может отдельным регулярным выражением
<?php
  $text 
'20.07.2008 10:35<a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/">'.
          
'</a><a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/">Немцы строят'.
          
' мечети!</a>Во время первого визита немецкого канцлера Ангелы Меркель '.
          
'в африканскую страну был подписан крупный контракт на строительство не'.
          
'мецкими компаниями третьей по величине мечети в мире. 20.07.2008 10:26'.
          
'<a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_k_evro2012_obe'.
          
'spechen/"></a><a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_'.
          
'k_evro2012_obespechen/">Рост количества гостиниц к ЕВРО-2012 обеспечен'.
          
'?</a>Для успешного проведения финала Чемпионата Евро-2012 столица Укра'.
          
'ины должна подготовить дополнительно 200 тыс. мест для приема гостей ч'.
          
'емпионата. Именно поэтому строительство отелей сегодня приобрело особу'.
          
'ю популярность. 20.07.2008 10:14<a href="/hotnews/2008/07/18/yujnyy_be'.
          
'reg_kryma_mojet_lishitsja_statusa_kurorta/"></a><a href="/hotnews/2008'.
          
'/07/18/yujnyy_bereg_kryma_mojet_lishitsja_statusa_kurorta/">Южный бере'.
          
'г Крыма может лишиться статуса курорта</a>Под видом отелей и санаторие'.
          
'в в Крыму строят частное жильё. Это превращает курорт в перенаселённую'.
          
' и шумную агломерацию.';

  
$pattern '#[\d]{1,2}\.[\d]{1,2}\.[\d]{4} [\d]{1,2}:[\d]{2}(.*?)(?=[\d]{1,2}\.[\d]{1,2}\.[\d]{4})#is';

  
preg_match_all($pattern$text$out);

  echo 
"<pre>";
  
print_r($out);
  echo 
"</pre>";
?>

   
 
 автор: cheops   (22.07.2008 в 12:07)   письмо автору
 
   для: Лена   (22.07.2008 в 10:10)
 

Или как-то работать вот с таким скриптом, первая цифра даты вырезается, но находится в соседнем элементе результирующего массива
<?php
  $text 
'20.07.2008 10:35<a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/">'.
          
'</a><a href="/hotnews/2008/07/18/nemtsy_strojat_mecheti/">Немцы строят'.
          
' мечети!</a>Во время первого визита немецкого канцлера Ангелы Меркель '.
          
'в африканскую страну был подписан крупный контракт на строительство не'.
          
'мецкими компаниями третьей по величине мечети в мире. 20.07.2008 10:26'.
          
'<a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_k_evro2012_obe'.
          
'spechen/"></a><a href="/hotnews/2008/07/18/rost_kolichestva_gostinits_'.
          
'k_evro2012_obespechen/">Рост количества гостиниц к ЕВРО-2012 обеспечен'.
          
'?</a>Для успешного проведения финала Чемпионата Евро-2012 столица Укра'.
          
'ины должна подготовить дополнительно 200 тыс. мест для приема гостей ч'.
          
'емпионата. Именно поэтому строительство отелей сегодня приобрело особу'.
          
'ю популярность. 20.07.2008 10:14<a href="/hotnews/2008/07/18/yujnyy_be'.
          
'reg_kryma_mojet_lishitsja_statusa_kurorta/"></a><a href="/hotnews/2008'.
          
'/07/18/yujnyy_bereg_kryma_mojet_lishitsja_statusa_kurorta/">Южный бере'.
          
'г Крыма может лишиться статуса курорта</a>Под видом отелей и санаторие'.
          
'в в Крыму строят частное жильё. Это превращает курорт в перенаселённую'.
          
' и шумную агломерацию.';

  
$out preg_split("#(?=[\d]{1,2}\.[\d]{1,2}\.[\d]{4}\s+[\d]{1,2}:[\d]{2})#"$text, -1PREG_SPLIT_NO_EMPTY);

  echo 
"<pre>";
  
print_r($out);
  echo 
"</pre>";
?>

   
 
 автор: Лена   (22.07.2008 в 17:56)   письмо автору
 
   для: cheops   (22.07.2008 в 12:07)
 

Не понятно вот что:
1. Как же потом "приклеить" отрезанную цифру на место?
2. И вот это не могу себе объяснить: (.*?) - должен встречаться любой знак, сколько угодно раз - *
Зачем тогда здесь "?"

   
 
 автор: sms-send   (22.07.2008 в 12:47)   письмо автору
 
   для: Лена   (22.07.2008 в 10:10)
 

Чуть подправил первый пример cheops'а:
<?php

preg_match_all
('~\\d{1,2}.\\d{1,2}.\\d{4}\\s+\\d{1,2}:\\d{2}(?:<a.*?>.*?</a>){2}.*?(?=\\d{1,2}.\\d{1,2}.\\d{4} \\d{1,2}:\\d{2}|$)~'$text$out);



Чуть подправил последний пример cheops'а:
<?php

$out 
preg_split("#(?<!\\d)(?=[\d]{1,2}\.[\d]{1,2}\.[\d]{4}\s+[\d]{1,2}:[\d]{2})#"$text, -1PREG_SPLIT_NO_EMPTY);

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования