Как получить <img>SRC из CDATA в RSS? - PullRequest
1 голос
/ 12 января 2012

Я получаю данные из RSS-канала с помощью Сороки.
$rss[description] содержит CDATA с элементами html:

<![CDATA[  
<div>  
 <a href='url'>  
  <img src='img_url' alt='aaa' title='bbb' border='0' width='116' height='116'>  
 </a>  
</div>]]>  
Some other text  

Как я могу извлечь "img_url" из этого?preg_match() единственный путь?Может быть, я могу использовать simpleXML?

Ответы [ 3 ]

0 голосов
/ 15 января 2012

CDATA у вас есть строка, содержащая HTML.Поэтому сначала обработайте его как текст, но так как этот текст должен содержать HTML, проанализируйте этот текст, используя решение, подходящее для анализа HTML.

Другими словами: используйте соответствующий инструмент (анализатор HTML) для задания(парсинг HTML) .

Уже существует существующих решений для парсинга HTML в PHP - например.см. ответы на эти вопросы:

  1. Как анализировать и обрабатывать HTML с помощью PHP?
  2. Надежный, зрелый анализатор HTML для PHP .

Итак, в принципе, вы уже можете получить строку HTML из своего XML.Теперь проанализируйте HTML и получите исходное изображение, используя некоторые из упомянутых выше решений.

Использование preg_match() для анализа HTML не очень хорошая идея , так как это должно быть оченьСложно сделать простую вещь, для которой подходит HTML-парсер.

0 голосов
/ 16 января 2012

Вы бы лучше не использовали регулярные выражения, где вы можете использовать надлежащие инструменты. Что-то, что приходит мне в голову (хотя, возможно, это можно сделать проще):

$descr = $rss[description]; // String. You have extracted description part from your feed

$dom = new DOMDocument();
$dom->loadHTML($descr); // or you can use loadXML
if (!$dom) {
    die('Error loading HTML string.');
}

$xml = simplexml_import_dom($dom);
$imgSrc = (string)$xml->body->div->a->img['src'];

Вот и мы. Исходя из вашего примера CDATA $imgSrc будет равен img_url.

0 голосов
/ 12 января 2012

да, вы должны использовать регулярное выражение, CDATA означает, что данные должны обрабатываться как обычная строка без разбора, поэтому вы должны думать, что это строка ..

...