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

PHP - dealing with HTML entities that are missing semicolon

我正在尝试编写一个脚本来解析远程 RSS 提要,并以 JSON 格式输出结果。

原始 RSS 提要包含 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 不会认出他们。

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

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

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

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

并替换为 [=14=];。参见 regex demo.

详情:

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

替换模式中的[=20=]是对整个匹配值的反向引用。

PHP 片段:

$re = '~&#\d{4}(?!;)~';
$str = '&#8211&#8210––';
$subst = '[=11=];';
$result = preg_replace($re, $subst, $str);
preg_replace("/&#(\d{4})(?!;)/i", "&#;", $item['desc']);