2016-09-28 5 views
1

원격 RSS 피드를 구문 분석하는 스크립트를 작성하고 그 결과를 JSON 형식으로 출력하려고합니다.PHP - 세미콜론이 누락 된 HTML 엔터티 다루기

원시 RSS 피드에는 , … 등과 같은 HTML 엔터티가 포함되어 있습니다.

나는 json_encode이 올바른 출력을 생성 할 수 있도록, 먼저 원시 내용에 html_entity_decode를 사용

$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의 entites 세미콜론 누락 된 것을 제외하고 잘 작동합니다. html_entity_decode은 인식하지 못합니다.

아마도 정규식을 사용하여 세미콜론없이 엔티티를 찾고 수정할 수 있다고 생각합니다. 그러나 그런 코드를 어떻게 작성해야할지 모르겠습니다. 어떤 생각?

이 문제를 해결할 다른 방법이 있습니까?

+0

몇몇 샘플이 도움이 될 것이다! –

+0

지금까지 나는'–'과'…'을 봅니다. 때로는 세미콜론을 사용하기도합니다. 때로는 그렇지 않습니다. – Shawn

답변

2

&# 다음에 오는 4 자리 숫자가 ;과 일치해야합니다.

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

$0;과 함께 사용하십시오. regex demo을 참조하십시오.

세부 :

  • &# - 문자 순서 &#
  • \d{4}-4 자리
  • (?!;) - 바로 4 자리 숫자 후 ;있을 경우 경기를 실패 부정적 예측.

대체 패턴의 $0은 전체 일치 값에 대한 역 참조입니다.

PHP 스 니펫 (snippet) :

$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

좀 더 이해하기 쉽도록 텍스트 나 설명을 추가하십시오. –