2012-10-13 6 views
1

strip_tags() 함수를 사용하지 않고 몇 가지 html 요소를 제거 할 수 있도록 텍스트 클리너를 만들려고합니다.php preg_replace가 패턴을 인식하지 못합니다.

내 정규식은 다음과 같습니다 <em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>

내 코드는 다음과 같습니다 : 나의 이해를 벗어난 이유로

$string = "some very messy string here "; 
$pattern = '<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>'; 
$replace = ' '; 

$clean = preg_replace($pattern, $replace, $string); 

echo $clean; 

이 에코는 아무 것도 반환하지 않습니다. 나는 대답은 '예 그 안에서 모든 콘텐츠에 테이블을 없애하려는 경우 요구하는 경우

당신의 시간

업데이트 # 1

주셔서 감사합니다.

+0

이 코드의 목적은 무엇입니까 - 왜 strip_tags를 사용하지 않으시겠습니까? – AD7six

+0

스트립 태그는 내가하고자하는 테이블의 내용을 삭제하지 않습니다. – Mike

+0

당신은 html을 가상 파싱하는 정규식을 사용하지 않는 것이 좋습니다. 스트립 태그는 태그를 제거하고, 테이블을 제거하려면 루틴을 원격 테이블에 작성하십시오. 예 : '

...
...
...'과 같이 이상한 결과가 나올 수 있습니다. – AD7six

답변

4

정규식에 구분 기호가 필요합니다. 예 :

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~'; 

구분 기호 here을 읽으십시오.

일부 HTML 사양 (대다수 XHTML을 제외하고는 모두)에서 대문자 태그를 사용할 수 있습니다. 대소 문자를 구분하지 않기 위해 수식어를 정규 표현식에 추가하는 것을 고려해보십시오. 또한 열기 태그와 닫기 태그 사이에 줄 바꿈이있는 경우 (기본적으로 .이 줄 바꿈과 일치하지 않기 때문에) 테이블 제거가 작동하지 않을 수 있습니다. 이 문제를 해결하기 위해 DOTALL 수정 s을 추가

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~is'; 

마지막으로 참고 : 다른 문제는 소금의 입자로 찍은해야 HTML로 정규식 솔루션을 지적했다. 중첩 된 테이블은 주석과 마찬가지로 문제를 일으킬 수 있습니다. 당신이 잘 다루고있는 데이터를 안다면, 문제는 일반 HTML보다 훨씬 덜 복잡 할 것입니다. 그러나 코드가 적어도 유효해야하고 중첩 구조 및 HTML 문자와 같은 모든 이상한 점에 대해 주석 등으로 ​​알고 있어야합니다.

+0

그랬지만 테이블을 제거하지 않기 때문에 정규 표현식의 정의가 잘못되었다고 생각합니다. – Mike

+1

'.'은 기본적으로 줄 바꿈과 일치하지 않습니다. 'i' :'s' 다음에 다른 수식어를 추가하십시오 .. DOTALL 수식 자라고 불리우며 점은 또한 줄 바꿈과 일치합니다 ... 나는 대답에 이것을 추가 할 것입니다 –

3

먼저 this answer을 살펴보십시오. 이것은 처음부터 일을 똑바로 설정해야합니다. 답변을 읽은 후에도 계속 진행하고 싶다면 다음을 알려주세요.

I want to <em<p>>emphasize</<p>em> that it's not possible! 

시도해보십시오!

+1

기술적으로 그는 그것을 분석하려고하지 않습니다. 또한 유효한 HTML입니까? 그렇다면이 의미는 무엇입니까? 마지막으로 클로즈 (close)하기 전에'<'를 열지 말고 여러 번 바꾸기를 실행하면 아마 그것을 풀 수 있습니다. –

+0

더 이상 동의 할 수 없습니다! 그러나 여기서 데이터는 상당히 균일하게 보입니다.이 정규식 중에서 선택하거나 수작업으로 약 5000 개의 기사를 정리해야합니다. 이는 영리하거나 효과적이지 않을 것입니다. – Mike

+1

@ m.buettner 게시 한 링크를 읽었습니까? 유효한 HTML인지 여부는 클라이언트의 (해커가 아닌) 유효한 HTML을 제공하는 책임이 아닙니다. 어서, 내 문장을 잡는 정규 표현식을 생각해 보면 더욱 복잡한 문장으로 당신에게 돌아올거야, hrhrhr. – aefxx

관련 문제