регулярное выражение для разбора строки XML с несколькими текстовыми блоками - PullRequest
1 голос
/ 27 июля 2010

Я не очень хорош в регулярных выражениях ... так что, если кто-то может помочь мне с этим (может быть, тривиальным)

[обновление] Во-первых, я не ищу лучший способ манипулирования XML (SimpleXMLElement, DOM и т. Д. ... это хорошо). Я просто ищу это регулярное выражение вне контекста XML.

у меня есть xml как этот

<myxml>
<node>21</node> som text with <entite>some</entite> other <b>nodes</b>
<node>22</node> some text
</myxml>

Я хотел бы извлечь <<strong> узел > со всеми другими энтитами и текстовыми блоками до следующего <<strong> узла > результат может быть как:

Array {
 [0] = "<node>21</node> som text with <entite>some</entite> other <b>nodes</b>",
 [1] = "<node>22</node> some text"
}

Я не хочу использовать DOMElement для анализа XML, поэтому я действительно ищу регулярное выражение.

спасибо, если у вас есть идея.

Ответы [ 2 ]

6 голосов
/ 27 июля 2010

Пожалуйста, не используйте регулярные выражения для анализа XML. Вот для чего нужны парсеры XML.

PHP имеет много встроенных прямо. Попробуйте DOM или SimpleXML для размера. Учитывая ваше требование подбирать текстовые узлы между двумя родственными тегами, вы также можете рассмотреть возможность работы с XMLReader , для вас может быть проще работать для этой конкретной задачи.

1 голос
/ 27 июля 2010

Используйте разбиение, чтобы разбить это на части:

<?php

$str = <<<EOT
<myxml>
<node>21</node> som text with <entite>some</entite> other <b>nodes</b>
<node>22</node> some text
</myxml>
EOT;

$res = array_slice( preg_split( "~(?=<node(?:[^>]|\".*?\"|'.*?')*>|</myxml>)~", $str ), 1, -1 );
print_r( $res );

Разбивка выражения:

(?=           # match before
  <node       # "<node"
  (?:         # match and don't capture this group
    [^>]        # match non ">"
    |           # OR
    \".*?\"     # match '"' and anything (don't be greedy) until the next '"'
    |           # OR
    '.*?'       # match "'" and anything (don't be greedy) until the next "'"
  )*          # ... as often as you like
  >           # ">"
  |           # OR
  </myxml>    # "</myxml>"
)             # 

Вы можете выбросить часть ([^>]|\".*?\"|'.*?')*, если уверены, что <node> никогда не имеет никаких атрибутов.

Обязательный отказ от ответственности: Пожалуйста, не делайте этого. Синтаксический анализ XML с помощью регулярного выражения - это очень плохая идея!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...