我试图编写一个脚本来解析远程RSS提要,并以JSON格式输出结果。
原始RSS Feed包含HTML实体,如–
,…
等
我首先在原始内容上使用html_entity_decode
,以便json_encode
生成正确的输出:
$rss = new DOMDocument();
$rss->load('https://www.example.com/feed');
$feed = array();
foreach ($rss->getElementsByTagName('item') as $node) {
$item = array (
'title' => html_entity_decode($node->getElementsByTagName('title')->item(0)->nodeValue,ENT_COMPAT,'UTF-8'),
'desc' => html_entity_decode($node->getElementsByTagName('description')->item(0)->nodeValue,ENT_COMPAT,'UTF-8'),
'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue,
);
$feed[] = $item;
}
$data = array();
foreach($feed as $item){
$data[] = array('url'=>$item['link'],'date'=>date('l, F d, Y g:i A',strtotime($item['date'])),'title'=>$item['title'],'desc'=>$item['desc']);
}
echo json_encode($data);
除了某些 HTML缺少分号之外,它的效果很好。 html_entity_decode
无法识别他们。
我想也许我可以使用正则表达式来查找和修复那些没有分号的实体。但我不知道如何编写这样的代码。有什么想法吗?
或者还有其他方法可以解决这个问题吗?
答案 0 :(得分:2)
您似乎只想匹配&#
后跟4位未跟;
后跟的数字。使用
'~&#\d{4}(?!;)~'
并与$0;
重新联系。请参阅regex demo。
详细:
&#
- 文字序列&#
\d{4}
- 4位数(?!;)
- 如果4个数字后面有;
,则表示匹配失败的否定前瞻。替换模式中的$0
是对整个匹配值的反向引用。
PHP代码段:
$re = '~&#\d{4}(?!;)~';
$str = '–‒––';
$subst = '$0;';
$result = preg_replace($re, $subst, $str);
答案 1 :(得分:0)
preg_replace("/&#(\d{4})(?!;)/i", "&#$1;", $item['desc']);