2010-03-12 5 views
19

닫히지 않은 모든 IMG 태그에서 정규식 바꾸기를 수행 할 수 있습니까? 그렇다면 어떻게 식별 할 수 있습니까?모든 HTML 닫히지 않은 IMG 태그 닫기

<img src="..." alt="..."> 

... 잠재적인 칸 데이트가 대체 될 수 있습니까?

업데이트 : 수십억 개의 이미지 태그가 있으며, 모든 이미지를 닫아야합니다. RegEx에 붙어 있지는 않습니다. 수동으로 모든 IMG 태그를 업데이트하는 것 외에는 다른 방법으로 충분합니다.

+3

참으로 좋은 질문입니다 +1! – ant

+0

HTML 또는 XHTML을 사용하고 있습니까? – Gumbo

+1

그는 HTML을 사용하고 있고 XHTML로 전환해야하는 것처럼 보입니다. 그렇습니까? –

답변

13
(<img[^>]+)(?<!/)> 

이 제대로 닫혀 있지 않은 img 태그를 일치 :

여기

뭔가 내가

!/usr/bin/env perl 

my @images = ('<img src="toto.jpg">', 
      '<img src="truc/machin.jpg" title="pouet" >', 
      '<img  src="pouet.jpg" alt="toto" />', 
      '<img src="math/a-greater-than-b.png" alt="a > b">'); 

foreach (@images) { 
    if (/<img\s+(([a-z]+=".*?")+\s*)>/) { 
    print "Match : <img $1 />\n"; 
    } 
} 

가 생산 펄에 노력했다. 그것은 당신이 사용하는 정규 표현식이 lookbehind (Ruby와 JavaScript는 그렇지 않지만 대부분의 사람들이하는)를 지원해야합니다. 역 참조 번호 1은 일치를 포함하므로이 정규 표현식을 검색하고 \1/>으로 바꾸면 잘 읽어야합니다.

당신이 > 내부 속성의 가능성을 설명해야하는 경우 예를 들어,

<img src="image.gif" alt="hey, look--->"> 
<img src="image/image.gif"> 

하고 혼자

<img src="image/image.gif" /> 

두고이 일치

(<img("[^"]*"|[^>])+)(?<!/)> 

을 사용할 수 있습니다 .

+0

이것은'img' 엘리먼트가 단일 텍스트 라인을 차지한다고 가정합니까? –

+0

아니요, 그렇지 않습니다. –

+0

그러나 alt 및 title 텍스트에는'> '가 포함되지 않는다고 가정합니다. (당신은 코드의 수백 페이지와 함께 보장되지 않습니다). –

3

HTML에서 <img>의 끝 태그는 "생략해야합니다". 시작 태그가 요소를 닫고 닫히지 않은 img을 가질 수 없습니다.

HTML을 XHTML로 변환하려면 실제 파서를 사용하십시오. 정규 표현식은이 직업에 적합한 도구는 아닙니다.

+0

XML의 일반 파서는 열린 태그를 허용하지 않습니다! – Dejell

+1

@Odelya - "실제 파서 사용"이라고 말하면 XML 구문 분석기가 아닌 HTML 파서를 의미했습니다. HTML이 XML이 아니기 때문에 이것은 분명해 보였다. – Quentin

0

"폐쇄되지 않은"이란 정확히 무엇을 의미합니까?

<img src="a1.jpg <--no ending quotes and end parens 
<img src="a1.jpg" <-- no end parens 
<img src="a1.jpg"> <-- the tag does not self-close as should be done in XHTML 

당신은 지능적으로 같은 용의자를 찾기 위해을 시도 할 수 있습니다,하지만 당신은 바보 - 증거를 보장하지 않습니다.

-1

나는 이것을 시도한 적이 없지만 닫힌 img 태그는 <img으로 시작하고 끝 부분에 />으로 시작하는 태그입니다.

Match : <img src="toto.jpg" /> 
Match : <img src="truc/machin.jpg" title="pouet" /> 
Match : <img src="math/a-greater-than-b.png" alt="a > b" /> 
+1

속성 값이 따옴표로 묶이지 않은 (유효하지 않음) 경우 또는 작은 따옴표 (유효한!)로 인용되거나 속성 이름에 영숫자가 아닌 문자 (HTML5의 data-foo)가 포함되거나 속성 이름에 대문자가 포함 된 경우이 값이 나옵니다. – Quentin

+0

대문자는 쉽게 처리 할 수 ​​있습니다. 나는 단순한 따옴표를 사용할 수 없지만, 그런 경우는 아니다. 다시 말하면, 쉽게 바꿀 수 있습니다 : [[ ""]을 (를) 대체하십시오. 그러나 당신은 알파가 아닌 문자에 적합합니다. 다시 말하지만, 할 수있는 일이지만 사양이 더 정확해야합니다. 그럼에도 불구하고이 작업을 자동으로 수행 할 수는 있지만 regexp 만 사용하는 것은 아닙니다. regexp는 꽤 좋은 첫 번째 필터 일뿐입니다. 나는 URL 계획이 그의 페이지에 항상 동일하면 이젠 그만일지도 모른다. 어쨌든 귀하의 의견을 기다립니다. – Aif

+0

''''[' " ']'로 바꾸면'foo ="bar'baz 'bar "'에서 깨질 수 있습니다. HTML은 ** 정규식으로 구문 분석하기 쉽지 ** 않습니다 **. – Quentin