2016-09-28 19 views
1

リモートRSSフィードを解析し、その結果をJSON形式で出力するスクリプトを作成しようとしています。PHP - セミコロンがないHTMLエンティティを扱う

生のRSSフィードには–…などのHTMLエンティティが含まれています。

json_encodeが正しい出力を生成するように、私は、最初の生の内容にhtml_entity_decodeを使用します。それは、セミコロンが欠落している一部 HTMLのentites以外うまく機能

$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_entity_decodeはそれらを認識しません。

おそらく正規表現を使ってセミコロンを使わずにこれらのエンティティを見つけて修正できると思っています。しかし、私はそのようなコードを書く方法を知らない。何か案が?

これに対処する方法はありますか?

+0

いくつかのサンプルが役立つだろう! –

+0

これまでのところ、私は '–'と '…'と表示されています。セミコロンがあることもあります。時々そうではない。 – Shawn

答えて

2

&#の後ろに4桁の数字が続いていて、それに続いて;と一致するようにしたいようです。使用

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

とrelaceと$0;regex demoを参照してください。

詳細

  • &# - リテラルシーケンス&#
  • \d{4}から4桁
  • (?!;)から;右は4桁の数字の後がある場合は、一致を失敗し、負の先読み。

置換パターンの$0は、完全一致値の逆参照です。

PHPスニペット:

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

完璧に動作します! – Shawn

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

答えを理解しやすくするために、テキストや説明を追加してください。 –

関連する問題