2016-09-19 6 views
-5

잘못된 태그를 제거하는 가장 좋은 방법은 무엇입니까? 이 간단한 예제보다 더문자열에서 잘못된 태그를 제거하는 가장 좋은 방법

<q>7</q> (<q>96</q><q>2</q>) <q>9</q><q>3</q><q>7</q> <q>4</q><q>2 2</q><q>4</q> 

더 :이 같은 태그 예를 들어

에 포함되어있는 경우

태그는이 라인

<q>+7</q> (<q><q>9</q>6</q><q>2</q>) <q>9</q><q>3</q><q>7</q> <q>4</q><q>2 2</q><q>4</q> 

제거 잘못된 태그, 잘못

이전 :

<p>bla-bla <p>bla-bla</p> bla-bla</p> 

은 후 :

<p>bla-bla bla-bla bla-bla</p> 
+2

http://htmlpurifier.org/를 사용해보십시오. – jeroen

+1

X/HTML 사양 *에 따라 * 잘못된 *을 의미하는 * 경우 XML 파서를 사용해야합니다 (PHP에서는 [DOMDocument] (http://php.net/dom)). – Sherif

+0

또한 준수하는 모든 XML 파서가 해당 태그를 허용 할만한 가치가 있습니다. HTML과 같은 언어는 의도적으로 무차별 적이기 때문에 여러분이 기대하는 것과 관련이 없습니다. 사양,'

foo는

바즈

에 따르면'단지'

foo는

바즈

'가 발생합니다. 새 문장을 열기 전에 첫 번째 단락 태그를 닫으려는 의도가 있다고 가정합니다. 그래서 당신에게 암묵적으로 도움이됩니다. – Sherif

답변

0

이 질문은 거의 당신이 알아야 할 모든 것을 커버 : RegEx match open tags except XHTML self-contained tags

길고 그것의 짧은 : 당신은 이것에 대한 정규식을 사용하지 마십시오. 당신은 "할 수있다"그러나 너무 복잡하여 코드의 다른 곳에 문제가 생길 수 있습니다. 코드베이스를 다듬거나 html 정수기, xml 파서 또는 다른 줄을 따라 실행하십시오. Regex는 문제에 대한 잘못된 해결책 일 가능성이 높습니다.

이 패턴을 사용할 수 있습니다
+1

이 질문이 중복 된 것으로 생각되면 간단하게 플래그를 지정하십시오. 대답으로 다른 질문에 대한 링크를 게시하면 혼란이 가중됩니다. –

0

:

(<(.+)>)(.+?)(<\2>)(.*?)(<\/\2>)(.*?)(<\/\2>)$ 

을 나는 당신이 볼 수 있습니다 당신은 PHP

에 다음과 같이
echo preg_replace("(<(.+)>)(.+?)(<\\2>)(.*?)(<\\/\\2>)(.*?)(<\\/\\2>)$", "$1$3$5$7$8", "<p>bla-bla <p>bla-bla</p> bla-bla</p>"); 

을 할 수 있다고 생각

$1$3$5$7$8 

에 대한 귀하의 문자열을 대체 여기에서 일하는이 정규 표현식의 라이브 예제 http://regexr.com/3e8o3

이 정규식이 재귀가 아니기 때문에 정규식이 끝날 때까지 while 루프에서이 코드를 호출해야 할 수도 있습니다. 따라서 3 단계 이상의 중첩 수준에서는 작동하지 않습니다.

관련 문제