두 태그 사이의 모든 텍스트를 선택하는 가장 좋은 방법은 무엇입니까? 예 : 페이지의 모든 'pre'태그 사이의 텍스트
/<div>.*?<\/div>/.exec("<div><div></div></div>")
두 태그 사이의 모든 텍스트를 선택하는 가장 좋은 방법은 무엇입니까? 예 : 페이지의 모든 'pre'태그 사이의 텍스트
/<div>.*?<\/div>/.exec("<div><div></div></div>")
답변:
를 사용 "<pre>(.*?)</pre>"
하고 (원하는 텍스트로 pre를 대체) 첫 번째 그룹을 추출 할 수 있지만 (보다 구체적인 지침을 위해 언어를 지정하는 경우) 매우 단순하고 유효한 HTML을 가지고 있다는 단순한 개념을 가정합니다.
다른 주석가가 제안했듯이 복잡한 작업을 수행하는 경우 HTML 파서를 사용하십시오.
<pre>
시도해도 여전히 태그 가 표시되는 경우 <pre>(.*?)<\/pre>
(. *?) 캡처 그룹 대신 전체 일치로 캡처 된 내용을보고 있기 때문입니다. 치즈 소리 처럼 들리지만 항상 "괄호 = 도둑 쌍"이라고 생각합니다 . 또는 (
뒤에 ?
in 이 오는 경우를 제외하고 모든 경기에는 두 개의 캡처가 있습니다. 각각의 추가 괄호 세트는 추가 캡처를 추가합니다. 작업중인 언어로 두 캡처를 모두 검색하는 방법을 알아야합니다. (?:
(?>
다른 줄에서 태그를 완성 할 수 있습니다. 이것이 \n
추가되어야하는 이유 입니다.
<PRE>(.|\n)*?<\/PRE>
(.|\n)*?
여러 줄에 걸쳐 HTML 태그를 다룰 때 추가 할 때 중요한 점 . 선택한 답변은 HTML 태그가 같은 줄에있는 경우에만 작동합니다.
(.|\n)*?
어떤 문자와도 일치 시키지 마십시오 . 항상 (단일) 수정 자 .
와 함께 사용하십시오 s
. 또는 [\s\S]*?
해결 방법.
/\*(.|\n)*?\*/
하는 작업을했다 - 당신 감사합니다
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
기본적으로 수행하는 작업은 다음과 같습니다.
(?<=(<pre>))
<pre>
태그 앞에 선택을 추가해야합니다.
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
이것은 내가 적용하려는 정규 표현식 일뿐입니다. 이 경우 문자 또는 숫자 또는 개행 문자 또는 대괄호로 예제에 나열된 일부 특수 문자를 선택합니다. 파이프 문자는 |
단순히 " OR "을 의미 합니다.
+?
위 문자 중 하나 이상을 선택하는 플러스 문자 상태-순서는 중요하지 않습니다. 물음표 는 기본 동작을 'greedy'에서 'ungreedy'로 변경합니다.
(?=(</pre>))
</pre>
태그에 선택을 추가해야합니다
사용 사례에 따라 ( i 또는 m ) 과 같은 수정자를 추가해야 할 수도 있습니다
여기서 나는 Sublime Text 에서이 검색을 수행 했으므로 정규 표현식에서 수정자를 사용할 필요가 없습니다.
위의 예제는 PHP, Perl, Java ... Javascript와 같은 언어에서 잘 작동하지만 lookbehind를 지원하지 않으므로 사용 방법을 잊고 (?<=(<pre>))
일종의 해결 방법을 찾아야합니다. 아마도 간단한 스트립 여기에 같은 각 선택에 대한 우리의 결과에서 처음 네 문자
태그 사이 정규식 일치하는 텍스트
또한 볼 JAVASCRIPT REGEX 문서 에 대한 비 캡처 괄호
요소 사이에 내용을 얻으려면 아래 패턴을 사용하십시오. 대체 [tag]
당신이에서 콘텐츠를 추출 할 실제 요소.
<[tag]>(.+?)</[tag]>
언젠가 태그는 같은 특성을 갖 anchor
태그 데 href
, 다음 패턴 아래를 사용합니다.
<[tag][^>]*>(.+?)</[tag]>
<[tag]>
일치 <t>
, <a>
그리고<g>
Replace [tag] with the actual element you wish to extract the content from
부분 을 놓친 것 같아요 .
[]
은 모두 생략해야합니다. 그 사람들이 먼저 코드를 스캔 것을 때문에 정규식과 사실 그 의미를 더 명확 이후 텍스트를 읽을 것이다)
구분 태그를 제외 시키려면 :
(?<=<pre>)(.*?)(?=</pre>)
(?<=<pre>)
뒤에 텍스트를 찾습니다 <pre>
(?=</pre>)
전에 텍스트를 찾습니다 </pre>
pre
태그 안에 결과가 표시됩니다
정규 표현식으로 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();
그리고 이것은 적절한 파서이기 때문에 중첩 태그 등을 처리 할 수 있습니다.
php
. PHP가 어떻게 사진에 등장했는지 잘 모르겠습니다 ...
이 시도....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
이 답변은 둘러보기를 지원한다고 가정합니다! 이를 통해 시작 및 종료 태그 쌍 사이의 모든 텍스트를 식별 할 수있었습니다. 이것이 '>'와 '<'사이의 모든 텍스트입니다. 둘러보기는 일치하는 문자를 소비하지 않기 때문에 작동합니다.
(? <=>) ([\ 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 '</'
나는 그것이 10의 시작으로 작용하기를 바랍니다. 행운.
파이썬에서 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
당신이 사용할 수있는 Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
<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>