2009-08-29 3 views
1

큰 HTML 블록에서 검색을 수행하고 바꿀 필요가 있습니다. 나는 HTML 태그 (URL과 같은)의 일부인 것을 바꾸고 싶지 않습니다. 또한 HTML 태그의 바깥쪽에 URL을 바꾸고 싶지 않습니다.정규식 대신 html 태그 내에서 또는 URL의 일부로 string1을 string2로 바꿉니다 (HTML 외부)

(?!([^<]+)?>)word 

그래서, 유일한 : 정규식 친구도이 같은 일치하는 것을 말한다 동안

word(?!([^<]+)?>) 

: 나는 HTML 내부에없는 단어 (src)을 일치시키기위한 부분적인 해결책을

(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$] 

나는이 가능한 경우 확실하지 오전, 내 의도가에 존재하는 URL을 유지하는 것입니다 같은 - 그 단어를 확인 할 일은 남은 것은 URL과 같은 문자열의 일부가 아닙니다 검색을 허용하고 무엇에 대한 작업을 대체하면서 텍스트, 내용의 HTML의 일부입니다 :

개 일치 효율성

<h1>DOG</h1> -> <h1>CAT</h1> 
<h1 class='DOG'>DOG</h1> -> <h1 class='DOG'>CAT</h1> 

<p class='DOG'>DOG: http://www.DOG.com/DOGfood.html DOGfood is delicious.</p> -> <p class='DOG'>CAT: http://www.DOG.com/DOGfood.html CATfood is delicious.</p> 

보너스 포인트 아래 그림과 같이 CAT로 대체 할 이상적인 솔루션 , 나는 거의 끝내고있다. 아닌 태그에 "개"를 일치에 관해서는

+0

HTML 규칙은 매우 복잡 할 수 있으며 HTML 콘텐츠 작성을 제어하지 않으면 규칙이 적용되지 않을 수 있습니다. 얼마나 많은 사이트가 W3C 유효성 검사를 통과 할 것임을 알고 있습니까? 정규식 대신 DOM 또는 다른 HTML 파서를 사용 해본 적이 있습니까? – TrueWill

+0

나는 Tidy를 실행하여 일이 처음 유효하다는 것을 확인하고, 가장 우아한 코드는 아니지만 98 % 유효 할 것입니다. DOM을 사용하면 IMHO가 과도하게 사용됩니다. 해답은 음수 어설 션과 문자열 앞에없는 다른 어설 션을 조합 한 것으로 보입니다. (https?| [-A-Z0-9 + & @ #/%? = ~ _ | $! :,]; )/% = ~ _ | $] 일종의 ... 생각해 보니 거의 대답은 ... –

+0

나는이 주장을하는 유일한 사람이 아닙니다. http://oubliette.alpha-geek.com/2003/12/31/do_not_do_not_parse_html_with_regexs를 참조하십시오. – TrueWill

답변

1

: 그 내가 일반적으로 그것을 할 것입니다 방법,하지만 난 대신 정규식 사용합니다 :

DOG(?![^<>]++>) 

[^<>]++ 하나 또는 아무것도의 이상과 일치하는 각도 아니다 브래킷 을 소유하고입니다. 완료되면, 다음 항목이 '>'이 아닌 경우 즉시 실패를보고합니다. 역 추적은 없습니다. 그것보다 더 효율적으로 일할 수는 없습니다.

그러나 URL 안에 있는지 여부를 확인하기 위해 둘러보기를 사용하는 아이디어는 효과가 없습니다. 그것은 가변 길이 lookbehind match를 필요로 할 것이고, PHP는 이것을 지원하지 않습니다 - 아주 적은 수의 regex flavors가 있습니다.

대체 방법을 권장합니다. 하나의 정규식, 당신은 완전한 HTML 태그, 완전한 URL, 또는 단어 중 하나와 일치 :

<[^<>]++> 
| 
(https?|ftp|file)://[A-Z0-9+&@#/%?=~_|$]++(?:[?!:,.;-]++[A-Z0-9+&@#/%=~_|$]++)*+ 
| 
DOG 

사용 preg_replace_callback 정규식을 적용을하고 콜백에서 당신은 일치하는 것을 확인한다. 태그 또는 URL 인 경우 다시 연결하십시오. 그것이 "개"라면 "CAT"로 바꿉니다.

파일의 각 꺾쇠 괄호가 HTML 태그의 일부라고 가정합니다. 파일에 SGML 주석이 포함되어 있다면 대신 HTML 태그 용 앞에 다른 옵션을 추가해야합니다. CDATA 섹션에서도 마찬가지입니다. 물론 속성 값에도 꺾쇠 괄호가 포함될 수 있습니다. 그것은 내 경험으로는 극히 드물지만 필요한 경우 처리 할 수도 있습니다.