2013-10-01 4 views
0

콘텐츠에있는 모든 이미지에 대해 src 및 나머지 속성을 가져올 정규식이 있습니다. 나는에 대해 일치하고있는 내용이속성 패턴 매처가 오래 걸린다

<img src=src1"/> <img src=src2"/> 

찾기 (인덱스)처럼 달려 그리고 내가 스레드 덤프

at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227) 
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345) 
    at java.util.regex.Pattern$Branch.match(Pattern.java:4114) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) 
    at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227) 
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345) 
    at java.util.regex.Pattern$Branch.match(Pattern.java:4114) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) 
    at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227) 
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345) 
    at java.util.regex.Pattern$Branch.match(Pattern.java:4114) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) 
    at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227) 
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345) 

에서 다음을 참조하면

<img *((.|\s)*?) *src *= *['"]([^'"]*)['"] *((.|\s)*?) */*> 

솔루션이 아니면 이 문제를 해결하기위한 해결 방법은 무엇입니까?

+0

계속하기 전에 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454을 읽을 수도 있습니다. –

+0

복제본 http://stackoverflow.com/a/2408599/20938) 결코 정규식에서'(. | \ s)'를 사용하지 마십시오. 단지 DOTALL 모드를 지정하고'.'을 단독으로 사용하십시오. –

+0

예제의 특성 값에 여는 따옴표가 없습니다. 그 질문에 당신이 도입 한 오타 일뿐입니다. –

답변

1

해결 방법은 예를 들어, JSoup으로 이러한 HTML 파서를 사용하는 것입니다

Document doc = 
     Jsoup.parse("<html><img src=\"src1\"/> <img src=\"src2\"/></html>"); 
Elements elements = doc.select("img[src]"); 
for (Element element: elements) { 
    System.out.println(element.attr("src")); 
    System.out.println(element.attr("alt")); 
    System.out.println(element.attr("height")); 
    System.out.println(element.attr("width")); 
} 
+0

그냥 src를 찾고있는 것이 아닙니다. 다른 속성도 필요합니다 (src 전후). 예를 들면. altText user2836528

+0

쉽게 완료 - 업데이트보기 – Reimeus

0

당신이있어하는 것은 흔한 일이다,에 "evil regex"처럼 당신이 복잡한을 구성 할 때 그것은 보인다 다른 것 (img) 내의 한 항목 (src)을 일치시키는 regex. 특히, 악의적 인 정규 표현식은 대개 (.|\s)*?을 사용하여 복잡한 하위 표현식에 반복을 적용하려고 할 때 발생합니다.

보다 나은 방법은 두 개의 정규식을 사용하는 것입니다. 하나는 모든 <img> 태그와 일치하고 다른 하나는 src 속성과 일치해야합니다.

내 자바의 녹슨, 그래서 난 그냥 당신에게 의사 솔루션주지 :이 src='abc'src="abc" 일치합니다

foreach(imgTag in input.match(/<img .*?>/ig)) { 
    src = imgTag.match(/\bsrc *= *(['\"])(.*?)\1/i); 
    // if you want to get other attributes, you can do that the same way: 
    alt = imgTag.match(/\balt *= *(['\"])(.*?)\1/i); 
    // even better, you can get all the attributes in one go: 
    attrs = imgTag.match(/\b(\w+) *= *(['\"])(.*?)\2/g); 
    // attrs is now an array where the first group is the attr name 
    // (alt, height, width, src, etc.) and the second group is the 
    // attr value 
} 

주 즉 닫는 따옴표 (적절한 유형과 일치하는 역 참조를 사용합니다. 또한 한정사가 (*? 대신 단지 *) 여기 게으른 참고,이 소비되는 것을 너무 많이 방지 할 필요가있다

편집 : 내 자바의 녹슨, 나는 예를 척척 할 수 있었다 여기에 비록.. Java의 솔루션 :

import java.util.regex.*; 

public class Regex { 

    public static void main(String[] args) { 
     String input = "<img alt=\"altText\" src=\"src\" height=\"50\" width=\"50\"/> <img alt='another image' src=\"foo.jpg\" />"; 
     Pattern attrPat = Pattern.compile("\\b(\\w+) *= *(['\"])(.*?)\\2"); 
     Matcher imgMatcher = Pattern.compile("<img .*?>").matcher(input); 
     while(imgMatcher.find()) { 
      String imgTag = imgMatcher.group(); 
      System.out.println(imgTag); 
      Matcher attrMatcher = attrPat.matcher(imgTag); 
      while(attrMatcher.find()) { 
       String attr = attrMatcher.group(1); 
       System.out.format("\tattr: %s, value: %s\n", attrMatcher.group(1), attrMatcher.group(3)); 
      } 
     } 
    } 
} 
+0

나는 이것이 "악의적 인 정규 표현식"인 방법을 정말로 모르지만 .. 설명해 주겠니? 몇 가지 디버깅 결과를 여기에서 볼 수 있습니다 : http://regex101.com/r/wH4rD7/#debugger –

+0

단지 src를 찾고있는 것이 아닙니다. 다른 속성도 필요합니다 (src 전후). 예를 들면. altText user2836528

+0

신중하게 보면, Lindrian, 위의 "악의있는 정규식"을 연결했습니다. 그것은 악의있는 ​​regexes에 대한 모든 것을 설명 할 것입니다. 두 번째 설명에 관해서는 몸 안쪽에 필요한 것을 빼낼 수도 있습니다. 내 접근 방식이 효과가있을뿐만 아니라 더 잘 작동 할 것입니다. 내 대답을 업데이트하여 모든 속성을 얻는 방법을 알려 드리겠습니다. –

관련 문제