Я пишу JSON parser
RSS
для JSON parser
и, как часть этого, мне нужно использовать htmlentities()
для любого тега, найденного внутри тега описания. В настоящее время я пытаюсь использовать preg_replace()
, но я немного preg_replace()
с этим. Мой текущий (нерабочий) код выглядит так:
$pattern[0] = "/\<description\>(.*?)\<\/description\>/is"; $replace[0] = '<description>'.htmlentities("$1").'</description>'; $rawFeed = preg_replace($pattern, $replace, $rawFeed);
Если у вас есть более элегантное решение, пожалуйста, поделитесь. Благодарю.
Просто. Использовать preg_replace_callback
:
function _handle_match($match) { return '<description>' . htmlentities($match[1]) . '</description>'; } $pattern = "/\<description\>(.*?)\<\/description\>/is"; $rawFeed = preg_replace_callback($pattern, '_handle_match', $rawFeed);
Он принимает любой тип обратного вызова, а также методы в классах.
Более элегантным решением будет использование SimpleXML . Или стороннюю библиотеку, такую как XML_Feed_Parser или Zend_Feed, для анализа фида.
Вот пример SimpleXML:
<?php $rss = file_get_contents('http://rss.slashdot.org/Slashdot/slashdot'); $xml = simplexml_load_string($rss); foreach ($xml->item as $item) { echo "{$item->description}\n\n"; } ?>
Имейте в виду, что RSS и RDF и Atom выглядят по-разному, поэтому может иметь смысл использовать одну из вышеупомянутых библиотек, о которых я упоминал.