정규식은 태그 사이의 모든 텍스트를 선택


143

두 태그 사이의 모든 텍스트를 선택하는 가장 좋은 방법은 무엇입니까? 예 : 페이지의 모든 'pre'태그 사이의 텍스트


2
가장 좋은 방법은 파이썬에 들어가면 "아름다운 수프"와 같은 html 파서를 사용하는 것입니다.
Fredrik Pihl

1
가장 좋은 방법은 XML / HTML 파서를 사용하는 것입니다.
Daniel O'Hara

4
일반적으로 정규 표현식을 사용하여 HTML을 구문 분석하는 것은 좋은 생각이 아닙니다. stackoverflow.com/questions/1732348/…
murgatroid99

임의로 중첩 된 태그는 HTML을 규칙적이지 않기 때문에 정규식으로 태그 사이에 텍스트를 구문 분석하지 마십시오. 일치하는 태그는 괜찮은 것 같습니다. /<div>.*?<\/div>/.exec("<div><div></div></div>")
jdh8

답변:


157

를 사용 "<pre>(.*?)</pre>"하고 (원하는 텍스트로 pre를 대체) 첫 번째 그룹을 추출 할 수 있지만 (보다 구체적인 지침을 위해 언어를 지정하는 경우) 매우 단순하고 유효한 HTML을 가지고 있다는 단순한 개념을 가정합니다.

다른 주석가가 제안했듯이 복잡한 작업을 수행하는 경우 HTML 파서를 사용하십시오.


41
태그 사이 의 텍스트 선택하지 않고 태그를 포함합니다.
capikaw


2
여러 줄 태그의 경우 : <html_tag> (. +) ((\ s) + (. +)) + <\ / html_tag>
Felipe Augusto

<pre>시도해도 여전히 태그 가 표시되는 경우 <pre>(.*?)<\/pre>(. *?) 캡처 그룹 대신 전체 일치로 캡처 된 내용을보고 있기 때문입니다. 치즈 소리 처럼 들리지만 항상 "괄호 = 도둑 쌍"이라고 생각합니다 . 또는 (뒤에 ?in 이 오는 경우를 제외하고 모든 경기에는 두 개의 캡처가 있습니다. 각각의 추가 괄호 세트는 추가 캡처를 추가합니다. 작업중인 언어로 두 캡처를 모두 검색하는 방법을 알아야합니다. (?:(?>
rbsdca

137

다른 줄에서 태그를 완성 할 수 있습니다. 이것이 \n추가되어야하는 이유 입니다.

<PRE>(.|\n)*?<\/PRE>

5
(.|\n)*?여러 줄에 걸쳐 HTML 태그를 다룰 때 추가 할 때 중요한 점 . 선택한 답변은 HTML 태그가 같은 줄에있는 경우에만 작동합니다.
Caleuanhopkins

3
Windows 줄 끝의 경우 <PRE> (. | \ n | \ r \ n) *? <\ / PRE>
Mark

3
(.|\n)*?어떤 문자와도 일치 시키지 마십시오 . 항상 (단일) 수정 자 .와 함께 사용하십시오 s. 또는 [\s\S]*?해결 방법.
Wiktor Stribiżew

내가 와서이 답변을 사용하므로, ++ 메모장에 코드 주석을 선택하고 싶었로 /\*(.|\n)*?\*/하는 작업을했다 - 당신 감사합니다
wkille

완벽한 답변 감사합니다
Omda

25

이것이 내가 사용하는 것입니다.

(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))

기본적으로 수행하는 작업은 다음과 같습니다.

(?<=(<pre>))<pre>태그 앞에 선택을 추가해야합니다.

(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )이것은 내가 적용하려는 정규 표현식 일뿐입니다. 이 경우 문자 또는 숫자 또는 개행 문자 또는 대괄호로 예제에 나열된 일부 특수 문자를 선택합니다. 파이프 문자는 |단순히 " OR "을 의미 합니다.

+?위 문자 중 하나 이상을 선택하는 플러스 문자 상태-순서는 중요하지 않습니다. 물음표 는 기본 동작을 'greedy'에서 'ungreedy'로 변경합니다.

(?=(</pre>))</pre>태그에 선택을 추가해야합니다

여기에 이미지 설명을 입력하십시오

사용 사례에 따라 ( i 또는 m ) 과 같은 수정자를 추가해야 할 수도 있습니다

  • i- 대소 문자 구분
  • m- 여러 줄 검색

여기서 나는 Sublime Text 에서이 검색을 수행 했으므로 정규 표현식에서 수정자를 사용할 필요가 없습니다.

자바 스크립트는 lookbehind를 지원하지 않습니다

위의 예제는 PHP, Perl, Java ... Javascript와 같은 언어에서 잘 작동하지만 lookbehind를 지원하지 않으므로 사용 방법을 잊고 (?<=(<pre>))일종의 해결 방법을 찾아야합니다. 아마도 간단한 스트립 여기에 같은 각 선택에 대한 우리의 결과에서 처음 네 문자 태그 사이 정규식 일치하는 텍스트

또한 볼 JAVASCRIPT REGEX 문서 에 대한 비 캡처 괄호


정규 표현식을 문자열에 넣으려면 작은 따옴표 나 큰 따옴표를`로 이스케이프해야합니다.
David Zwart

18

요소 사이에 내용을 얻으려면 아래 패턴을 사용하십시오. 대체 [tag]당신이에서 콘텐츠를 추출 할 실제 요소.

<[tag]>(.+?)</[tag]>

언젠가 태그는 같은 특성을 갖 anchor태그 데 href, 다음 패턴 아래를 사용합니다.

 <[tag][^>]*>(.+?)</[tag]>

첫 번째 예를 '<head> (. +?) </ head>'로 시도하고 예상대로 작동합니다. 그러나 두 번째 결과는 없습니다.
Alex Byrth

1
이 작동하지 않습니다. <[tag]>일치 <t>, <a>그리고<g>
마틴 슈나이더에게

2
@ MA-Maddin-당신이 그 Replace [tag] with the actual element you wish to extract the content from부분 을 놓친 것 같아요 .
LWC

2
아, 그래 이것들 []은 모두 생략해야합니다. 그 사람들이 먼저 코드를 스캔 것을 때문에 정규식과 사실 그 의미를 더 명확 이후 텍스트를 읽을 것이다)
마틴 슈나이더

14

구분 태그를 제외 시키려면 :

(?<=<pre>)(.*?)(?=</pre>)

(?<=<pre>) 뒤에 텍스트를 찾습니다 <pre>

(?=</pre>) 전에 텍스트를 찾습니다 </pre>

pre태그 안에 결과가 표시됩니다


내용이 태그 사이에 새로운 라인이있는 경우 @krishna thakor의 대답에이 모양을 사용하는 사람들은 또한 고려할 수
KingKongCoder

이것은 내 경우에 도움이되었습니다 (개행을 고려할 필요가 없음). 감사.
Pking

6

정규 표현식으로 HTML을 구문 분석하려고해서는 안됩니다. 이 질문을 참조하십시오 과 그 결과를 .

가장 간단한 용어로 html은 정규 언어가 아니므로 정규 표현식을 사용하여 완전히 구문 분석 할 수 없습니다.

비슷한 태그가 중첩되어 있지 않으면 html의 하위 집합을 구문 분석 할 수 있다고 말했습니다. 따라서 태그 자체와 태그 자체가 아닌 한 작동합니다.

preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )

더 나은 아이디어는 네이티브 DOMDocument와 같은 파서를 사용하여 html을로드 한 다음 태그를 선택하고 다음과 같은 내부 html을 얻는 것입니다.

$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();

그리고 이것은 적절한 파서이기 때문에 중첩 태그 등을 처리 할 수 ​​있습니다.


2
나는 이것이 여전히 downvotes를 수집하고 있다는 것을 약간 혼란스럽게 말하고 싶지만 정규 표현식 옆에 적절한 솔루션을 제공하는 유일한 대답이며 아마도 올바른 방법이 아니라는 충분한 경고를 추가했습니다 ... 적어도 내 대답에 대해 잘못된 점에 대해서는 언급하십시오.
sg3s

1
질문에 태그가 없습니다 php. PHP가 어떻게 사진에 등장했는지 잘 모르겠습니다 ...
trincot

@trincot 이것은 7 년이 넘었으므로 기억이 나지 않습니다. 어쨌든 정규 표현식과 파서로 문제를 해결하는 예입니다. 정규식은 좋으며 PHP는 당시 내가 잘 알고 있었던 것입니다.
sg3s

나는 당신의 첫 번째 의견을 보았고 이것이 일부 공감대를 설명 할 수 있다고 생각했습니다.
trincot


4

이것은 내가 찾은 모든 것의 가장 간단한 정규 표현 인 것 같습니다

(?:<TAG>)([\s\S]*)(?:<\/TAG>)
  1. (?:<TAG>)경기에서 오프닝 태그 제외
  2. ([\s\S]*)일치 하는 공백 또는 공백이 아닌 문자를 포함
  3. (?:<\/TAG>)경기에서 닫는 태그 제외

3

이 답변은 둘러보기를 지원한다고 가정합니다! 이를 통해 시작 및 종료 태그 쌍 사이의 모든 텍스트를 식별 할 수있었습니다. 이것이 '>'와 '<'사이의 모든 텍스트입니다. 둘러보기는 일치하는 문자를 소비하지 않기 때문에 작동합니다.

(? <=>) ([\ w \ s] +) (? = </)

이 HTML 조각을 사용하여 https://regex101.com/ 에서 테스트했습니다 .

<table>
<tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr>
<tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6</td></tr>
</table>

세 가지 부분으로 구성된 게임입니다. 뒤에서보기, 내용 및보기.

(?<=>)    # look behind (but don't consume/capture) for a '>'
([\w\s]+) # capture/consume any combination of alpha/numeric/whitespace
(?=<\/)   # look ahead  (but don't consume/capture) for a '</'

regex101.com에서 화면 캡처

나는 그것이 10의 시작으로 작용하기를 바랍니다. 행운.


감사합니다. 이것은 더 나은 답변 일뿐 만 아니라 regex101 사이트에 대한 훌륭한 링크입니다. 공감! 🙂
Sean Feldman

2

var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
    str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });

허용 된 답변에는 자바 스크립트 코드가 없으므로 다음을 추가하십시오.


1

preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)이 정규 표현식은 태그 사이의 모든 것을 선택합니다. 새로운 줄에 상관없이 (멀티 라인으로 작업하십시오.


1

파이썬에서 DOTALL플래그를 설정하면 줄 바꿈을 포함하여 모든 것이 캡처됩니다.

DOTALL 플래그가 지정된 경우 이는 개행을 포함한 모든 문자와 일치합니다. docs.python.org

#example.py using Python 3.7.4  
import re

str="""Everything is awesome! <pre>Hello,
World!
    </pre>
"""

# Normally (.*) will not capture newlines, but here re.DOTATLL is set 
pattern = re.compile(r"<pre>(.*)</pre>",re.DOTALL)
matches = pattern.search(str)

print(matches.group(1))

python example.py

Hello,
World!

문서의 모든 열기 및 닫기 태그 사이에서 텍스트 캡처

문서에서 모든 열기 및 닫기 태그 사이에 텍스트를 캡처하려면 finditer유용합니다. 아래 예에서는 <pre>문자열에 3 개의 여는 태그 와 닫는 태그가 있습니다.

#example2.py using Python 3.7.4
import re

# str contains three <pre>...</pre> tags
str = """In two different ex-
periments, the authors had subjects chat and solve the <pre>Desert Survival Problem</pre> with a
humorous or non-humorous computer. In both experiments the computer made pre-
programmed comments, but in study 1 subjects were led to believe they were interact-
ing with another person. In the <pre>humor conditions</pre> subjects received a number of funny
comments, for instance: “The mirror is probably too small to be used as a signaling
device to alert rescue teams to your location. Rank it lower. (On the other hand, it
offers <pre>endless opportunity for self-reflection</pre>)”."""

# Normally (.*) will not capture newlines, but here re.DOTATLL is set
# The question mark in (.*?) indicates non greedy matching.
pattern = re.compile(r"<pre>(.*?)</pre>",re.DOTALL)

matches = pattern.finditer(str)


for i,match in enumerate(matches):
    print(f"tag {i}: ",match.group(1))

python example2.py

tag 0:  Desert Survival Problem
tag 1:  humor conditions
tag 2:  endless opportunity for self-reflection

0

여러 줄의 경우 :

<htmltag>(.+)((\s)+(.+))+</htmltag>


0

이 솔루션을 사용합니다.

preg_match_all( '/<((?!<)(.|\n))*?\>/si',  $content, $new);
var_dump($new);

-1

Javascript (다른 것들 중에서도)는 간단합니다. 속성과 여러 줄을 다룹니다.

/<pre[^>]*>([\s\S]*?)<\/pre>/

-4
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>

6
단어를 사용하여 답을 소개 / 설명하십시오.
Andrew Regan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.