|
|
|
| Здравствуйте!
Есть код:
<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", чтобы потом с этими данными было удобно работать?
Могу, конечно, подобное циклами сделать, но решение не будет каким-то элегантным. | |
|
|
|
|
|
|
|
для: switcher
(18.02.2010 в 10:26)
| | Как вариант (регулярка) вытаскивания текста:
(<h1>([^<]*)|<span class=\"[td]\">([^<]*)) | |
|
|
|
|
|
|
|
для: baston
(18.02.2010 в 11:13)
| | Спасибо! | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: heed
(18.02.2010 в 14:57)
| | Написал вам письмо. Надеюсь дошло? Если нет, процитирую сюда. Ответить мне лучше письмом | |
|
|
|
|
|
|
|
для: switcher
(18.02.2010 в 17:43)
| | получил, вроде так читабельно слегка, если сохранить в txt, и открыть как koi8r
:) наверное я плохо объясняю всегда,) regexp они просто ищут, они ищут то что соответствует
, или другими словами возможно найти одно среди многого, нужно знать чем оно отличатся от всего остального.
, например нельзя найти только одно какое-нибудь случайное ">" если таких ">" вокруг много.
поэтому я и говорил что неизвестно многое.
не видя весь текст
, или не представляя что в нём ещё может встречаться
, нельзя сказать что найдётся то что нужно.
тем-более вопрос был о иерархическом упорядочивании, а это ещё нужно представлять себе в каком порядке всё идёт
а так даже не интереcно что-то делать придумывая себе чего там может быть или быть не может
, прикрепляйте то откуда нужно выташить, или давайте ссылку на этот html ,
можно и не на почту,)
но это чисто случайно я её почитал сейчас ,) могу забывать на месяцы, да и простой ответ на форум иногда на половину времени суток растягивается :) по всяким обстоятельствам | |
|
|
|
|
|
|
|
для: switcher
(18.02.2010 в 17:43)
| | Зачем речь идет о div-ах и их вложенности, если они не где не фигурируют в регулярных выражениях. А идея на счет DOM мне кажется не плохая, может будет только медлено работать. | |
|
|
|
|
|
|
|
для: 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 несущественно
//даже можно убрать из выражения "|" | |
|
|
|
|
|
|
|
для: switcher
(18.02.2010 в 10:26)
| | зачем извращаться с регулярокй, если есть DOM? | |
|
|
|