Как разобрать HTML-контент CDATA XML с помощью SimpleXML?

Я пытаюсь отобразить содержимое Xml в таблицах, все работает отлично, но некоторое содержимое в теге, которое я не хочу отображать, я хочу только изображение, но не

Ноябрь 2012 Календарь из 5.10 Тест

как в xml,

<content:encoded><![CDATA[<p>November 2012 calendar from 5.10 The Test</p> <p><a class="shutterset_" href='http://img.ruphp.com/php/laura-bertram-trance-gemini-145-1080.jpg' title='&lt;br&gt;November 2012 calendar from 5.10 The Test&lt;br&gt; &lt;a href=&quot;</a></p>]]> </content:encoded> 

Я хочу отображать изображение, но не

Ноябрь 2012 Календарь из 5.10 Тест

,

 <?php // load SimpleXML $item = new SimpleXMLElement('test1.xml', null, true); echo <<<EOF <table border="1px"> <tr cl> </tr> EOF; foreach($item->channel->item as $boo) // loop through our books { echo <<<EOF <tr> <td rowspan="3">{$boo->children('content', true)->encoded}</td> <td>{$boo->title}</td> </tr> <tr> <td>{$boo->description}</td> </tr> <tr> <td>{boo->comments}</td> </tr> EOF; } echo '</table>'; ?> 

Я как-то ответил, но больше не нахожу ответа.

Если вы посмотрите на строку (упрощенное / украшенное):

 <content:encoded><![CDATA[ <p>Lorem Ipsom</p> <p> <a href='laura-bertram-trance-gemini-145-1080.jpg' title='&lt;br&gt;November 2012 calendar from 5.10 The Test&lt;br&gt; &lt;a href=&quot;</a> </p>]]> </content:encoded> 

Вы можете видеть, что HTML-код закодирован внутри значения узла элемента <content:encoded> . Поэтому сначала вам нужно получить значение HTML, которое вы уже делаете:

 $html = $boo->children('content', true)->encoded; 

Затем вам нужно проанализировать HTML внутри $html . С помощью каких библиотек HTML-анализ может быть выполнен с помощью PHP, он описан в:

  • Как анализировать и обрабатывать HTML / XML с помощью PHP?

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

  • PHP DOMDocument получает атрибут тега

Или для его сестринской библиотеки SimpleXML, которую вы уже используете (так что это рекомендуется, см. Также следующий раздел):

  • Как получить атрибут с SimpleXML?

В контексте вашего вопроса здесь приведен следующий совет:

Вы используете SimpleXML. DOMDocument – это сестра-библиотека, что означает, что вы можете обмениваться между двумя, поэтому вам не нужно изучать полную новую библиотеку.

Например, вы можете использовать только функцию разбора HTML DOMDocument , но затем импортировать ее в SimpleXML . Это полезно, потому что SimpleXML не поддерживает разбор HTML.

Это работает через simplexml_import_dom() .

Упрощенный шаг за шагом пример:

 // get the HTML string out of the feed: $htmlString = $boo->children('content', true)->encoded; // create DOMDocument for HTML parsing: $htmlParser = new DOMDocument(); // load the HTML: $htmlParser->loadHTML($htmlString); // import it into simplexml: $html = simplexml_import_dom($htmlParser); 

Теперь вы можете использовать $html как новый SimpleXMLElement, который представляет HTML-документ. Поскольку в ваших фрагментах HTML не было тегов <body> , в соответствии со спецификацией HTML, они помещаются в <body> . Это позволит вам, например, получить доступ к href первого <a> внутри второго элемента <p> в вашем примере: #

 // access the element you're looking for: $href = $html->body->p[1]->a['href']; 

Здесь полный вид сверху ( онлайн-демонстрация ):

 // get the HTML string out of the feed: $htmlString = $boo->children('content', true)->encoded; // create DOMDocument for HTML parsing: $htmlParser = new DOMDocument(); // your HTML gives parser warnings, keep them internal: libxml_use_internal_errors(true); // load the HTML: $htmlParser->loadHTML($htmlString); // import it into simplexml: $html = simplexml_import_dom($htmlParser); // access the element you're looking for: $href = $html->body->p[1]->a['href']; // output it echo $href, "\n"; 

И что он выводит:

 laura-bertram-trance-gemini-145-1080.jpg 

вам нужно будет разобрать URL-адрес изображения, например, через preg_match и это регулярное выражение '(http://(?:[^']*))'