ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

проблемы с рекурсией в PCRE (php)
  #1  
Старый 11.02.2009, 11:17
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию проблемы с рекурсией в PCRE (php)

очень срочно нужно написать регулярное выражение чтобы отпарсить определенную строку. Сложность в том что каждая подстрока имеет еще другую последовательность разной длинны.
Примерно вот
Код HTML:
<div>
<h1>STR_1<h1>
  <h2>STR_2</h2>
   <ol>
     <li> STR_3
     <li> STR_4
     <li> STR_5
   </ol>
</div>

<div>
<h1>STR_1<h1>
  <h2>STR_2</h2>
   <ol>
     <li> STR_3
     <li> STR_4
     <li> STR_5
     <li> STR_6
     <li> STR_7
   </ol>
</div>
вот мне нужно отпарсить и получить все данные на месте помеченным STR_
 
Ответить с цитированием

  #2  
Старый 11.02.2009, 17:56
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

Почему у тебя тег <li> не закрыт </li>??? Уже припарился я
 
Ответить с цитированием

  #3  
Старый 11.02.2009, 19:16
Gifts
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме:
2769640

Репутация: 1304


По умолчанию

slesh Тут рекурсивные регулярки НЕ нужны (только замедлят), вначале получаем все что между дивов, а потом уже получаем все STR

PHP код:
<pre><?
$in
=<<<HTT
<div>
<h1>STR_1a</h1>
  <h2>STR_2a</h2>
   <ol>
     <li> STR_3a
     <li> STR_4a
     <li> STR_5a
   </ol>
</div>

<div>
<h1>STR_1b</h1>
  <h2>STR_2b</h2>
   <ol>
     <li> STR_3b
     <li> STR_4b
     <li> STR_5b
     <li> STR_6b
     <li> STR_7b
   </ol>
</div>
HTT;
//echo $in;
preg_match_all('~<div>(.+)</div>~Usi',$in,$result);
foreach(
$result[1] as $i => $one)
{
    
// Получсаем заголовки
    
preg_match('~<h1>([\s\S]*)</h1>\s*<h2>([\s\S]*)</h2>~Ui',$one,$head);
    
// Выдираем все элементы списка
    
preg_match_all('~<li> ([^\r\n]*)~i',$one,$tmp);
    echo 
'<hr>'.$head[1].'<hr>'.$head[2].'<hr>';
    
print_r($tmp[1]);
}
?>
 
Ответить с цитированием

  #4  
Старый 12.02.2009, 00:25
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

2 Pashkela: Как есть так есть. Да и вообщето </li> - необязателен (читай доки )
2 Gifts: спс за код. Просто думал что возможно это сделать в один проход
 
Ответить с цитированием

  #5  
Старый 12.02.2009, 00:50
Chaak
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме:
5321514

Репутация: 3313


Отправить сообщение для Chaak с помощью ICQ
По умолчанию

Ну вы пиздецы..

PHP код:
preg_match_all("#<li>(.*?)(\n|<)#i",$text,$res); 
print_r($res); 
не рулит?

Последний раз редактировалось ChaaK; 12.02.2009 в 00:52..
 
Ответить с цитированием

  #6  
Старый 12.02.2009, 00:56
.:EnoT:.
Постоянный
Регистрация: 29.05.2007
Сообщений: 852
Провел на форуме:
4832771

Репутация: 1916


По умолчанию

Можно и одним проходом, главное составить нужную регулярку. Если бы у тебя тег li был закрыт, то регулярка выглядела бы так:

PHP код:
<?php

$str 
= <<<STR

<div>
<h1>STR_1a</h1>
  <h2>STR_2a</h2>
   <ol>
     <li> STR_3a</li>
     <li> STR_4a</li>
     <li> STR_5a</li>
   </ol>
</div>

<div>
<h1>STR_1b</h1>
  <h2>STR_2b</h2>
   <ol>
     <li> STR_3b</li>
     <li> STR_4b</li>
     <li> STR_5b </li>
     <li> STR_6b</li>
     <li> STR_7b</li>
   </ol>
</div>

STR;


preg_match_all('#<(h[12]{1}|li)>([^>]*)</\\1>#s'$str$out);
print_r($out[2]);

?>

Или если всё таки они не закрыты, то парсим вот так:

PHP код:
<?php

$str 
= <<<STR

<div>
<h1>STR_1a</h1>
  <h2>STR_2a</h2>
   <ol>
     <li> STR_3a
     <li> STR_4a
     <li> STR_5a
   </ol>
</div>

<div>
<h1>STR_1b</h1>
  <h2>STR_2b</h2>
   <ol>
     <li> STR_3b
     <li> STR_4b
     <li> STR_5b
     <li> STR_6b
     <li> STR_7b
   </ol>
</div>

STR;


preg_match_all("#<(h[12]{1}|li)>([^>]*)(</h[12]{1}>|\r\n)#s"$str$out);
print_r($out[2]);

?>

Хитрый финт ушами))
 
Ответить с цитированием

  #7  
Старый 12.02.2009, 00:57
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

2 ChaaK скажено же что нужно не только то, что в LI но и заголовки.
И вообще эта тема уже неактуально ибо строчность уже пропала.
 
Ответить с цитированием

  #8  
Старый 12.02.2009, 00:58
.:EnoT:.
Постоянный
Регистрация: 29.05.2007
Сообщений: 852
Провел на форуме:
4832771

Репутация: 1916


По умолчанию

Цитата:
Сообщение от ChaaK  
Ну вы пиздецы..

PHP код:
preg_match_all("#<li>(.*?)(\n|<)#i",$text,$res); 
print_r($res); 
не рулит?
не рулит, т.к. ему нужно получить текст не только между тегами LI, но и между дивами
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ