두 태그 사이의 모든 텍스트를 선택하는 가장 좋은 방법은 무엇입니까? 예 : 페이지의 모든 ‘pre’태그 사이의 텍스트
답변
를 사용 "<pre>(.*?)</pre>"
하고 (원하는 텍스트로 pre를 대체) 첫 번째 그룹을 추출 할 수 있지만 (보다 구체적인 지침을 위해 언어를 지정하는 경우) 매우 단순하고 유효한 HTML을 가지고 있다는 단순한 개념을 가정합니다.
다른 주석가가 제안했듯이 복잡한 작업을 수행하는 경우 HTML 파서를 사용하십시오.
답변
다른 줄에서 태그를 완성 할 수 있습니다. 이것이 \n
추가되어야하는 이유 입니다.
<PRE>(.|\n)*?<\/PRE>
답변
이것이 내가 사용하는 것입니다.
(?<=(<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 문서 에 대한 비 캡처 괄호
답변
요소 사이에 내용을 얻으려면 아래 패턴을 사용하십시오. 대체 [tag]
당신이에서 콘텐츠를 추출 할 실제 요소.
<[tag]>(.+?)</[tag]>
언젠가 태그는 같은 특성을 갖 anchor
태그 데 href
, 다음 패턴 아래를 사용합니다.
<[tag][^>]*>(.+?)</[tag]>
답변
구분 태그를 제외 시키려면 :
(?<=<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();
그리고 이것은 적절한 파서이기 때문에 중첩 태그 등을 처리 할 수 있습니다.
답변
이 시도….
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)