[Oracle] 문자열에서 HTML 태그 값 추출 방법
- 데이터베이스/오라클
- 2022. 9. 25.
오라클에서 HTML 문자열 내부의 특정 태그 값을 추출하기 위해서는 정규식 함수를 사용하면 쉽게 해결된다. 정규식 함수는 Oracle 10g 이상에서 사용할 수 있으며, Oracle 11g 이상에서는 XMLTYPE 함수를 사용하여 문자열에서 태그 값을 추출할 수 있다. XMLTYPE 함수는 사용하기는 편하지만 특정 패터만 추출이 가능하며, 조금 더 세밀한 태그 값을 추출하기 위해서는 정규식 함수(REGEXP_SUBSTR)를 사용하면 된다.
목차 |
REGEXP_SUBSTR 함수를 사용하여 태그 값 추출
정규식을 사용하여 문자열에서 태그 값 추출 (Oracle 10g 이상)
WITH temp AS (
SELECT '<html>'
|| ' <head>'
|| ' <title>This is Title</title>'
|| ' </head>'
|| ' <body>'
|| ' <h1>This is heading</h1>'
|| ' <p>This is Paragraph 1</p>'
|| ' <p>This is Paragraph 2</p>'
|| ' </body>'
|| '</html>' AS html_string
FROM dual
)
SELECT REGEXP_SUBSTR(html_string, '<h1>.*?</h1>') AS tag_val
FROM temp
REGEXP_SUBSTR 정규식 함수를 사용하여 HTML 문자열에서 H1 태그 값을 추출하는 예제이다.
H1 태그가 여러 개 있을 경우 첫 번째 태그만 추출된다.
태그는 제외하고 내부 문자열만 추출 (Oracle 11g 이상)
WITH temp AS (
SELECT '<html>'
|| ' <head>'
|| ' <title>This is Title</title>'
|| ' </head>'
|| ' <body>'
|| ' <h1>This is heading</h1>'
|| ' <p>This is Paragraph 1</p>'
|| ' <p>This is Paragraph 2</p>'
|| ' </body>'
|| '</html>' AS html_string
FROM dual
)
SELECT REGEXP_SUBSTR(html_string, '(<h1>)(.*?)(</h1>)', 1, 1, 'i', 2) AS tag_val
FROM temp
오라클 11g부터 REGEXP_SUBSTR 함수에서 사용할 수 있는 기능이 추가되어서 태그(H1)는 제외하고 태그 내부의 문자열만 추출할 수 있다.
REGEXP_SUBSTR('문자열', '정규표현식', '시작위치', '추출순번', '대소문자구분', '출력할정규식그룹(괄호)순번')
동일한 태그가 여러 개 있을 경우 연속으로 추출 (Oracle 11g 이상)
WITH temp AS (
SELECT '<html>'
|| ' <head>'
|| ' <title>This is Title</title>'
|| ' </head>'
|| ' <body>'
|| ' <h1>This is heading</h1>'
|| ' <p>This is Paragraph 1</p>'
|| ' <p>This is Paragraph 2</p>'
|| ' </body>'
|| '</html>' AS html_string
FROM dual
)
SELECT REGEXP_SUBSTR(html_string, '(<p>)(.*?)(</p>)', 1, LEVEL, 'i', 2) AS tag_val
FROM temp
CONNECT BY LEVEL <= REGEXP_COUNT(html_string, '(<p>)(.*?)(</p>)', 1, 'i')
문자열에서 동일한 태그(P)가 여러 개 있을 경우 CONNECT BY를 사용하여 연속해서 태그 값을 추출할 수 있다.
REGEXP_COUNT 함수는 오라클 11g 이상에서 사용 가능하다.
XMLTYPE 함수를 사용하여 태그 값 추출
문자열에서 동일한 태그가 한 개만 있을 경우 (Oracle 11g 이상)
WITH temp AS (
SELECT '<html>'
|| ' <head>'
|| ' <title>This is Title</title>'
|| ' </head>'
|| ' <body>'
|| ' <h1>This is heading</h1>'
|| ' <p>This is Paragraph 1</p>'
|| ' <p>This is Paragraph 2</p>'
|| ' </body>'
|| '</html>' AS html_string
FROM dual
)
SELECT XMLTYPE(html_string).EXTRACT('/html/body/h1/text()').GETSTRINGVAL() AS tag_val
FROM temp
XMLTYPE 함수를 사용하여 특정 태그(H1) 값을 추출할 수 있다. (태그의 대소문자 구분함)
오라클 11g 이상에서 사용 가능하다.
태그 내부에 새로운 태그가 존재한다면 정상적으로 추출되지 않는다. (예, <h1>This is <b>heading</b></h1>)
B태그는 제외한 This is만 반환된다.
문자열에서 동일한 태그가 여러 개 있을 경우 (Oracle 11g 이상)
WITH temp AS (
SELECT '<html>'
|| ' <head>'
|| ' <title>This is Title</title>'
|| ' </head>'
|| ' <body>'
|| ' <h1>This is heading</h1>'
|| ' <p>This is Paragraph 1</p>'
|| ' <p>This is Paragraph 2</p>'
|| ' </body>'
|| '</html>' AS html_string
FROM dual
)
SELECT XMLTYPE(html_string).EXTRACT('/html/body/p/text()').GETSTRINGVAL() AS tag_val
FROM temp
문자열에서 동일한 태그(P)가 여러 개 있을 경우 태그 내부의 문자열만 추출한 후 하나의 문자열로 반환한다.