Я получаю данные из RSS-ленты с Magpie.
$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?
CDATA
есть строка, содержащая HTML. Поэтому сначала рассматривайте его как текст, но поскольку этот текст предназначен для размещения HTML, проанализируйте этот текст, используя решение, подходящее для синтаксического анализа HTML.
Другими словами: используйте соответствующий инструмент (парсер HTML) для задания (разбор HTML) .
Есть уже существующие решения для синтаксического анализа HTML в PHP – например. см. ответы на следующие вопросы:
Итак, в принципе, вы уже можете получить строку HTML из своего XML. Теперь проанализируйте HTML и получите источник изображения, используя некоторые из упомянутых выше решений.
Использование preg_match()
для синтаксического разбора HTML не является хорошей идеей , так как это должно быть очень сложным для простого простого анализатора HTML.
Лучше не использовать регулярные выражения, где вы можете использовать правильные инструменты. Что-то, что приходит мне на ум (хотя, возможно, это можно сделать проще):
$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
.
да, вы должны использовать регулярное выражение, CDATA означает, что данные следует рассматривать как обычную строку без синтаксического анализа, поэтому вы должны считать это строкой.