2012-04-20 5 views
0

Нужно регулярное выражение, чтобы поймать все вложенное в целевой тег.Извлечение из XML с использованием Regex

<?xml version="1.0" encoding="utf-8"?> 
<data> 
<target> 
"<x id="c400c8394f0a" pid="NLCaption" name="NLCaption" />Caption" 
</target> 

<target /> 

<target><x id="a1e6b03cb682" pid="NLSheets" name="NLSheets" />Sheets"</target> 

</data> 

Благодаря Brettz, кто помог мне в написании регулярного выражения

$pattern = "@<target(?:\s.*?)?>(.*?)</target\s*>@s"; 

Это регулярное выражение делает работу и помочь мне получить все содержимое. Но единственная проблема заключается в том, что он также ловит тег <target />.

Я хочу изменить регулярное выражение, которое donot ловит непарный тег. т.е. <target />

Пожалуйста, помогите мне

ответ

1
$tagname = 'target'; 
$pattern = "@<$tagname(?:\s.*?!/)?>(.*?)</$tagname\s*>@s"; 
4

Использование SimpleXML

$data = new SimpleXMLElement($xmlstr); 
echo $data->target[0]; 

Here is an example of using SimpleXML with your XML

+0

Спасибо! Возможно, ты прав. Но сейчас мне нужно исправить это регулярное выражение. В принципе, я хочу нейтрализовать вложенные теги в целевом узле. – Shahid

+3

@Shahid Парсинг XML с использованием реального XML-анализатора намного проще (как вы это испытываете), используя Regex, чтобы сделать то же самое ... используйте правильный инструмент для задания ... – ManseUK

+0

Мне нужно создать строку как следовать, и это необходимо будет также записывается фактический файл (т.е. обновить его содержание), и я не был в состоянии сделать это, используя DOM разборе ' " < х ID = " c400c8394f0a " PID = " NLCaption " имя =" NLCaption "/ > Подпись " ' – Shahid

0

Вы можете изменить конец первой секции, чтобы только пробелы и никакие другие символы:

<target\s*>(.*?)</target\s*>

Анализатор xml почти наверняка остается правильным долгосрочным решением, но это быстрый способ заставить ваш код работать.

+0

'$ тэгом = 'цели'; (.? *)' '$ шаблон =" <$tagname\s*> ";' '$ content = preg_replace_callback ($ pattern, html_entities, $ xml);' Неизвестный модификатор '(' in ..... ??? – Shahid

+0

Я хочу включать только первое что '[^ /]' ie '/' не может произойти в этом разделе, так как это можно сделать? – Shahid

+0

Проверьте синтаксис preg_replace: измените свой код на '$ pattern =" # <". $ tagname." \ s *> (. *?) # is ";' – Andrew

Смежные вопросы