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

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

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

 

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

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

тема: Парсинг списка
 
 автор: switcher   (18.02.2010 в 10:26)   письмо автору
 
 

Здравствуйте!
Есть код:

<div>
    <h1>заголовок1</h1>
    <div>
        <span class="t">текст1</span>
        <span class="d">текст2</span>
    </div>
    <div>
        <span class="t">текст3</span>
        <span class="d">текст4</span>
    </div>
    <div>
        <span class="t">текст5</span>
        <span class="d">текст6</span>
    </div>
</div>

Таких div'ов первого уровня много, это я для примера только 1 привёл.
Как можно одной регуляркой извлечь то, что стоит в h1 и потом все class="t", class="d", чтобы потом с этими данными было удобно работать?
Могу, конечно, подобное циклами сделать, но решение не будет каким-то элегантным.

  Ответить  
 
 автор: baston   (18.02.2010 в 11:13)   письмо автору
 
   для: switcher   (18.02.2010 в 10:26)
 

Как вариант (регулярка) вытаскивания текста:
(<h1>([^<]*)|<span class=\"[td]\">([^<]*))

  Ответить  
 
 автор: switcher   (18.02.2010 в 12:35)   письмо автору
 
   для: baston   (18.02.2010 в 11:13)
 

Спасибо!

  Ответить  
 
 автор: heed   (18.02.2010 в 14:57)   письмо автору
 
   для: switcher   (18.02.2010 в 12:35)
 

то-же самое только придумал.

без цикла только какой-нибудь preg_replace_callback()
, или просто обрабатывать массив из preg_match_all() в цикле

не думаю что чем просто совпадения будет легче обрабатывать полученный массив
, например такой
<pre><?php
$txt 
'<div> 
    <h1>заголовок1</h1> 
    <div> 
        <span class="t">текст1</span> 
        <span class="d">текст2</span> 
    </div> 
    <div> 
        <span class="t">текст3</span> 
        <span class="d">текст4</span> 
    </div> 
    <div> 
        <span class="t">текст5</span> 
        <span class="d">текст6</span> 
    </div> 
</div>
<div> 
    <h1>заголовок2</h1> 
    <div> 
        <span class="t">2текст1</span> 
        <span class="d">2текст2</span> 
    </div> 
</div>'
;

$array = array();

function 
obr($m){
    static 
$x=-1;
    global 
$array;
//    print_r($m);
?><hr><?
    
if(empty($m[1])) $array[++$x] = array( $m[2] );
    else 
$array[$x][] = array($m[1], $m[2]);
    return 
'';
}

//$reg = '@\G((? >[^{]*|(?!{if){)*) # то что до {if
//#x';
$reg '#<(?:h1|span\s+class="([dt])")\s*>\s*([^<]+)#';

preg_replace_callback($reg'obr'$txt);
print_r($array);

и неизвестно чего там в тексте, будут-ли в таком-же порядке чередоваться такие теги
, неизвестно может-ли быть вложенность более глубокой, и чего кроме этого там есть
, а может, может и было-бы удобнее в одно совпадение включать сразу весь такой div

  Ответить  
 
 автор: switcher   (18.02.2010 в 17:43)   письмо автору
 
   для: heed   (18.02.2010 в 14:57)
 

Написал вам письмо. Надеюсь дошло? Если нет, процитирую сюда. Ответить мне лучше письмом

  Ответить  
 
 автор: heed   (18.02.2010 в 19:40)   письмо автору
 
   для: switcher   (18.02.2010 в 17:43)
 

получил, вроде так читабельно слегка, если сохранить в txt, и открыть как koi8r
:) наверное я плохо объясняю всегда,) regexp они просто ищут, они ищут то что соответствует
, или другими словами возможно найти одно среди многого, нужно знать чем оно отличатся от всего остального.

, например нельзя найти только одно какое-нибудь случайное ">" если таких ">" вокруг много.
поэтому я и говорил что неизвестно многое.

не видя весь текст
, или не представляя что в нём ещё может встречаться
, нельзя сказать что найдётся то что нужно.

тем-более вопрос был о иерархическом упорядочивании, а это ещё нужно представлять себе в каком порядке всё идёт
а так даже не интереcно что-то делать придумывая себе чего там может быть или быть не может

, прикрепляйте то откуда нужно выташить, или давайте ссылку на этот html ,
можно и не на почту,)
но это чисто случайно я её почитал сейчас ,) могу забывать на месяцы, да и простой ответ на форум иногда на половину времени суток растягивается :) по всяким обстоятельствам

  Ответить  
 
 автор: big-trot   (19.02.2010 в 20:51)   письмо автору
 
   для: switcher   (18.02.2010 в 17:43)
 

Зачем речь идет о div-ах и их вложенности, если они не где не фигурируют в регулярных выражениях. А идея на счет DOM мне кажется не плохая, может будет только медлено работать.

  Ответить  
 
 автор: heed   (19.02.2010 в 22:21)   письмо автору
 
   для: big-trot   (19.02.2010 в 20:51)
 

я просто так и понял что нужен только текст
, а вложенность, если ещё и неограниченная это уже рекурсия типа такой
<?php 
header
('content-type: text/plain');
$txt '<div>  
    <h1>заголовок1</h1>  
    <div>  
        <span class="t">текст1</span>  
        <span class="d">текст2</span>  
    </div>  
</div> 
<div>  
    <h1>заголовок2</h1>  
    <div>  
        <span class="t">2текст1</span>  
        <div>
            <span class="d">2текст2</span>  
        </div>          
    </div>  
</div>'


function 
obr($m){ 
    global 
$reg;
    
echo 
preg_replace('#<div\b.*#s'''$m[1])
 .
'____________________________';
preg_replace_callback($reg'obr'$m[1]);
# плюс хотя-бы ещё тоже махинации
# со статическими переменными для определения текущего уровня
    
return ''
}

$reg '#<div[^>]*>((?>(?:[^<]*(?!</?div).?)+|(?R)?)*)</div\s*>#s'
obr(array(0$txt));
?>
, рекурсия слишком плоская в preg_функциях
или
более сложный анализ простого разбиения текста.
, мне второе кажется более рациональным.
, с рекурсией больше действий над текстом, и как и кажется в DOM правильно обрабатывается только правильная вложенность, но в таком простом случае с одними div несущественно

//даже можно убрать из выражения "|"

  Ответить  
 
 автор: GeorgeIV   (19.02.2010 в 10:19)   письмо автору
 
   для: switcher   (18.02.2010 в 10:26)
 

зачем извращаться с регулярокй, если есть DOM?

  Ответить  
Rambler's Top100
вверх

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