반응형
일을 하다가 특정 태그 사이의 텍스트를 추출 해야할 필요가 생겼다.
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;
}
반응형
'IT' 카테고리의 다른 글
[Laravel] npm ERR! Maximum call stack size exceeded (0) | 2021.05.10 |
---|---|
[paste.js] 클립보드 복사, 붙여넣기 (이미지, 텍스트) (0) | 2021.02.05 |
[JS] VanillaJS (0) | 2020.11.26 |
[Laravel] Livewire 라이브와이어 (0) | 2020.11.18 |
[Vue] Laravel에 Vue 설치하기 및 실행 예제 (Laravel 7.x) (0) | 2020.06.04 |