IT

[PHP] 태그 사이의 텍스트 추출 정규식 (HtmlDomParser)

집탱구리 2020. 12. 9. 10:57
반응형

일을 하다가 특정 태그 사이의 텍스트를 추출 해야할 필요가 생겼다.

p태그 사이에 있는 텍스트를 추출 해야하는데 p태그에 있는 클래스와 인라인 스타일 코드가 제각각이었고

p태그 안에 span태그가 또 껴있는 경우를 발견하였다.

 

1. HtmlDomParser를 이용해 본문 html을 추출

2. 정규식을 통해 p태그 추출

3. p태그 사이에 있는 태그 제거

 

// $html은 본문
// 본문의 html을 추출한다.
$body_obj = HtmlDomParser::str_get_html($html);.
// html을 문자열로 받는다.
$html = $body_obj->outertext;

// 텍스트 변수
$text = '';

// 줄바꿈 변수
$crlf = "\n";

// html요소들 중 p태그만 추출
$p_tags = $body_obj->find('p');

// $p_tag가 배열 이기 때문에 반복문으로 텍스트만 추출
foreach ($p_tags as $str) {
  $inner_text = $str->innertext;
  $inner_text = strip_tags($inner_text);
  $text .= sprintf('%s%s', $inner_text, $crlf);
}

if ($text !== '') {
	// 텍스트가 있는경우 본문으로 활용
  	$_body = $text;
} else {
    // p태그가 통째로 지워질 경우
    // 정규식으로 본문에서 p태그를 찾는다.
    preg_match_all('/<p(.*?)>(.*?)<\/p>/i', $html, $p_match);
    
    foreach ($p_match[0] as $_p => $p_tag) {
    	// html로 요소들로 추출
    	$p_object = HtmlDomParser::str_get_html($p_tag);
        // p태그를 찾는다.
    	$_p = $p_object->find('p');
        // p태그를 문자열로 받는다.
        $inner_text = $_p[0]->innertext;
        // p태그 사이에 또 어떤 태그들이 있을 수 있으므로 strip_tags로 제거한다.
        $text .= sprintf('%s%s', strip_tags($inner_text), $crlf);
    }
    $_body = $text;
}
반응형