А вот кто напишет или кинет идею такого регекспа?

@leg

Новичок
А вот кто напишет или кинет идею такого регекспа?

а вот у кого нить была задачка вычленить тег с содержанием ну к примеру по аттрибуту?
...
<tag attr="xxx">...</tag>
...
нужно вычленить по поиску attr="xxx"
<tag attr="xxx">...</tag>
задача изначально кажется простой поэтому сразу скажу что в содержании тоже могут быть вложены одноименные теги.
<tag attr="xxx">
<tag>...</tag>
...
<tag>...<tag>...</tag>...</tag>
...
</tag>
мне в голову приходит только мысль о рекурсии. а как связать рекурсию и регексп в голову не приходит.
кто делал подобное?
 

alekciy

Новичок
У меня на вскидку рождается только две ассоциации:
1) поиск через регулярное выражение (что долго);
2) поиск в заданной строке нужной подстроки (это быстрее, но формат записи подстроки должен быть точно известен).
Есть и третий вариант, только изврещенный :)
 

romy4

invoke [brain]
в рэгекспе все варианты предусмотреть будет не возможно.
у меня как-то была подобная задача, но после недели ковыряния рекурсивного регеспа я плюнул и написал парсер, что оказалось гораздо эффективнее:)
 

@leg

Новичок
...рекурсивного регеспа
здесь очень интересно, я так и не понял как делать рекурсию в регекспах. хотя бы маленьий пример в качестве идеи, можно абстрактно
...и написал парсер
ого. я вот тоже стал думать на тему а не использовать ли XML разбор, как более общий случай ХТМЛ
...что оказалось гораздо эффективнее:)
здесь тоже интересно, имхо быстрее регекспа парсеры деревьев никак не могут быть.
 

Nick Mitin

Новичок
@leg
preg_replace_callback поштудируй.

я с помощью него и делал рекурсию в регекспах.
 

Andreika

"PHP for nubies" reader
ого. я вот тоже стал думать на тему а не использовать ли XML разбор, как более общий случай ХТМЛ
есть и вполне себе html "парсер" - tidy

ЗЫ. http://www.phpclub.ru/talk/showthread.php?s=&postid=511557#post511557
 

@leg

Новичок
preg_replace_callback поштудируй.
я с помощью него и делал рекурсию в регекспах.
звучит смело. а можно пример? у меня к примеру callback даже $1 не ест в качестве имени функции. но в любом случае я имел ввиду рекурсию в самом регекспе. и потом топик иной: мне важно по топику ответ, а не советы что то штудировать.
 

romy4

invoke [brain]
@leg
здесь очень интересно, я так и не понял как делать рекурсию в регекспах. хотя бы маленьий пример в качестве идеи, можно абстрактно
об этом в мануале
ого. я вот тоже стал думать на тему а не использовать ли XML разбор, как более общий случай ХТМЛ
да дело в том, что хмл разборщик требует корректного написания html кода. вы ведь вряд ли будете использовать конструкции типа
PHP:
<script>[!CDATA[ javascript.codes()]]</script>
так что вот так. можете, конечно, юзать, как уже предложили tidy или simpleXML
здесь тоже интересно, имхо быстрее регекспа парсеры деревьев никак не могут быть.
это да. вот только опять же, сделать такой регексп мне лично было не под силам.
------------------
было что-то вроде (не уверен в работоспособности, я по памяти вспоминал)
~({((\s*([\w\-]+)\s*([\=\-\+]{0,2})([\"\'])?(.*?)?(?>\5)?))|(?R))})~
 

@leg

Новичок
Автор оригинала: Andreika
ого. я вот тоже стал думать на тему а не использовать ли XML разбор, как более общий случай ХТМЛ
есть и вполне себе html "парсер" - tidy
да тайди интересная с первого взгляда вещь, однако не понятно как ей решать мою задачу.
а по этой ссылке вообще не понятно что к чему, причем из примера не видно вложенности однооименных тегов
 

romy4

invoke [brain]
@legвот и я не стал ломать голову с тайди. просто мне легче все писать ручками (сложилась привычка со времен асма еще:)
а по той ссылке и не предполагается вложенная рекурсия регекспов. там просто обработка строк и вложенность считается счетчиком
 

@leg

Новичок
Автор оригинала: romy4
@leg
об этом в мануале
не серьезный ответ. что такое регексп и рекурсия я знаю. мне не ясно как сделать рекурсию в регекспе. хочется совет примером а не совет советом.
да дело в том, что хмл разборщик требует корректного написания html кода. вы ведь вряд ли будете использовать конструкции типа
PHP:
<script>[!CDATA[ javascript.codes()]]</script>
уверен что и в случае <script>javascript.codes()</script>вернет мне все что нужно
мне главное не сохранять структуру валидную а просто вычленить корректно информацию
так что вот так. можете, конечно, юзать, как уже предложили tidy или simpleXML

это да. вот только опять же, сделать такой регексп мне лично было не под силам.
------------------
было что-то вроде (не уверен в работоспособности, я по памяти вспоминал)
~({((\s*([\w\-]+)\s*([\=\-\+]{0,2})([\"\'])?(.*?)?(?>\5)?))|(?R))})~
ого. это надо переварить. хотя на первый взгляд это вообще не то ;)
 

romy4

invoke [brain]
@leg
не серьезный ответ. что такое регексп и рекурсия я знаю. мне не ясно как сделать рекурсию в регекспе. хочется совет примером а не совет советом.
ты просто не знаешь, как устроена рекурсия в регекспах. поэтому сначала надо изучить мануал. все просто:)
уверен что и в случае <script>javascript.codes()</script>вернет мне все что нужно
мне главное не сохранять структуру валидную а просто вычленить корректно информацию
не будь так уверен:) я ж говорю, что пробовал использовать XML парсер для подобного кода --- он не понимает. ему нужен корректный XML код.
 

Nick Mitin

Новичок
@leg
Пример я конечно напишу! А почему-бы попробовать XPath

PHP:
  $dom = new DOMDocument();
  $dom->load("xpt.xml");
  $xPath = new DOMXPath($dom);
  $result = $xPath->query("//*[@attr='xxx']");
  print "nodes with attr set to 'xxx': " . $result->length . "<br />";
  $result = $xPath->query("//tag[@attr='xxx']");
  print "nodes named tag with attr set to 'xxx': " . $result->length . "<br />";
При работе с этим документом:

Код:
<?xml version="1.0" encoding="utf-8"?>
<tag>
  <tag attr="xxx">
  </tag>
  <tag attr="yyy">
    <foo attr="xxx">
      <bar attr="xxx">
      </bar>  
    </foo>
  </tag>
  <tag attr="zzz">
  </tag>
  <tag attr="xxx">
  </tag>
</tag>
дает:

nodes with attr set to 'xxx': 4
nodes named tag with attr set to 'xxx': 2
 

@leg

Новичок
Автор оригинала: Nick Mitin
@leg
Пример я конечно напишу! А почему-бы попробовать XPath
Ооооо! Це дело!!! Вот я примерно так и задумывал, кстати еще до твоего примера начал читать про XPath... Похож то что надо. Спасибо тебе, Ник Митин, положительный пример всегда педагогичнее. :)
 
Сверху