Я пытаюсь отобразить содержимое 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='<br>November 2012 calendar from 5.10 The Test<br> <a href="</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='<br>November 2012 calendar from 5.10 The Test<br> <a href="</a> </p>]]> </content:encoded>
Вы можете видеть, что HTML-код закодирован внутри значения узла элемента <content:encoded>
. Поэтому сначала вам нужно получить значение HTML, которое вы уже делаете:
$html = $boo->children('content', true)->encoded;
Затем вам нужно проанализировать HTML внутри $html
. С помощью каких библиотек HTML-анализ может быть выполнен с помощью PHP, он описан в:
Если вы решите использовать более или менее рекомендуемый DOMDocument
для задания, вам нужно только получить значение атрибута для определенного элемента:
Или для его сестринской библиотеки 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://(?:[^']*))'