PHP - 处理缺少分号的HTML实体

时间:2016-09-28 18:42:18

标签: php regex html-entities

我试图编写一个脚本来解析远程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无法识别他们。

我想也许我可以使用正则表达式来查找和修复那些没有分号的实体。但我不知道如何编写这样的代码。有什么想法吗?

或者还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您似乎只想匹配&#后跟4位未跟;后跟的数字。使用

'~&#\d{4}(?!;)~'

并与$0;重新联系。请参阅regex demo

详细

  • &# - 文字序列&#
  • \d{4} - 4位数
  • (?!;) - 如果4个数字后面有;,则表示匹配失败的否定前瞻。

替换模式中的$0是对整个匹配值的反向引用。

PHP代码段:

$re = '~&#\d{4}(?!;)~';
$str = '&#8211&#8210––';
$subst = '$0;';
$result = preg_replace($re, $subst, $str);

答案 1 :(得分:0)

preg_replace("/&#(\d{4})(?!;)/i", "&#$1;", $item['desc']);