2012-03-26 2 views
0

HTML 소스에서 FONT 태그 내부에 다음 세 가지 속성 (순서는 관계 없음)이있는 간단한 텍스트를 추출해야합니다. size = 5, color = "red", face = "verdana".html 태그의 속성을 검사하기위한 정규 표현식

정규식은 예를 들어 마지막 4 개를 제외한 다음의 "임의 문자"를 모두 추출해야합니다.

<\s*font(?=[^>]*\s+size\s*=\s*5)(?=[^>]*\scolor\s*=\s*["']red["'])(?=[^>]*\sface\s*=\s*["']verdana["'])[^>]*>\s*([^<]+?)\s*<\s*/font\s*> 

문제가 있다는 것입니다 : ... 이상 HTML 유연성

<font(?=[^>]* size=5)(?=[^>]* color="red")(?=[^>]* face="verdana")[^>]*>([^<]+)</font> 

:

<font size=5 color="red" face="verdana">randomtext</font> 
<font size=5 face="verdana" color="red">randomtext</font> 
<font color="red" size=5 face="verdana">randomtext</font> 
<font color="red" face="verdana" size=5>randomtext</font> 
<font face="verdana" size=5 color="red">randomtext</font> 
<font face="verdana" color="red" size=5>randomtext</font> 
<font size=5 size=5 size=5>randomtext</font> 
<font face="verdana" color="red" size=5 foobar="random">randomtext</font> 
<font face="verdana" color="red" size=5 foobar="random=pippo">randomtext</font> 
<font face="verdana" color="red" size=5 garbagetext>randomtext</font> 

나는 3보기 이것은 미리를 사용하여 "임의의 순서로"문제를 해결 그것은 또한 마지막 세 가지와 일치합니다. 일치하는 항목을 제외하려면 어떻게해야합니까? (분명 일반 및 합리적인 짧은/효율적인 방법으로, 즉 가능한 모든 긍정적 인 조합을 codyfing없이 문자 부정적인 내 예에서만 작동 식을 사용하지 않고)

+4

어떤 언어를 사용하고 있습니까? 이 작업은 적절한 HTML 구문 분석 라이브러리로 훨씬 쉽게 처리됩니다. –

+0

Michael, 언어 독립적 인 단일 정규 표현식으로 해결되어야합니다. 정규 표현식은 PCRE입니다. – Imbuter

+0

이 숙제가 있습니까? – huon

답변

0

는이 어려운지고 있음을 인식? 다른 가능성이 있다면 사용하십시오!

정규식의 경우이 시도 :

  1. (?![^>]*(?<!color|size|face)=)이 주장 뒤에 중첩 된 부정적인 표정으로 부정적 예측이다

    <font(?=[^>]* size=5)(?=[^>]* color="red")(?=[^>]* face="verdana")(?![^>]*(?<!color|size|face)=)(?:\s+[^>\s=]+=[^>\s=]+\s*)+>([^<]+)</font> 
    

    가 내가 추가 here on Regexr

    를 참조하십시오/두 가지를 변경 색상, 크기 또는 얼굴이 없을 때 등호를 허용하지 않습니다.

  2. 특성과 일치하는 [^>]*(?:\s+[^>\s=]+=[^>\s=]+\s*)+으로 변경하여 등호가없는 공백이 아닌 시퀀스와 만 일치하도록했습니다. 또한 정규 표현식은 작업의 도구가 아닙니다 말한다 사람에 따라

+0

이 정규 표현식도 제 예제의 7 번째와 마지막으로 잘못 매치 한 것 같습니다. 지금까지 가장 좋은 해결책은 Birei의 것입니다.더 컴팩트 한 정규식 솔루션을 찾고 있습니다 (동일한 속성을 두 번 포함하지 않습니다) – Imbuter

+0

Regexr 링크를 보셨습니까? 원하는대로 모든 예제를 일치시킵니다. – stema

+0

Regexr에서 테스트 한 결과 다음과 일치한다는 것을 알았습니다. randomtext. 나는 속성을 반복하는 것은 의미가 없다는 것을 이해하지만 그 일치를 제외하는 것이 더 좋습니다. – Imbuter

1

한 가지 방법 :

script.pl의 내용 (내부 정규 표현식와 설명) :

use warnings; 
use strict; 

while (<DATA>) { 
    printf qq[Text matched: %s\t (original string: %s)\n], $1, $& if 
    m/ 
     # At begin of line, '<' character plus optional space. 
     \A < \s* 
     # Literal 'font' word. 
     font 
     # Mandatory space. 
     \s+ 
     # Positive look-ahead for string 'size=5' 
     (?= .* size \s* = \s* 5 (?:\s+|>)) 
     # Positive look-ahead for string 'face="verdana"' 
     (?= .* face \s* = \s* "verdana" (?:\s+|>)) 
     # Positive look-ahead for string 'color="red"' 
     (?= .* color \s* = \s* "red" (?:\s+|>)) 
     # If last three look-ahead succeed, match them. 
     (?:size\s*=\s*5\s*|color\s*=\s*"red"\s*|face\s*=\s*"verdana"\s*){3} 
     # Literal '>' character. 
     > 
     # Text between tags. 
     ([^>]+) 
     # Close tag and match end of string. 
     <\/font> \Z 
    /x; 
} 

__DATA__ 
<font size=5 color="red" face="verdana">randomtext</font> 
<font size=5 face="verdana" color="red">randomtext</font> 
<font color="red" size=5 face="verdana">randomtext</font> 
<font color="red" face="verdana" size=5>randomtext</font> 
<font face="verdana" size=5 color="red">randomtext</font> 
<font face="verdana" color="red" size=5>randomtext</font> 
<font size=5 size=5 size=5>randomtext</font> 
<font face="verdana" color="red" size=5 foobar="random">randomtext</font> 
<font face="verdana" color="red" size=5 foobar="random=pippo">randomtext</font> 
<font face="verdana" color="red" size=5 garbagetext>randomtext</font> 

실행이 같은 : 다음과 같은 결과로

perl script.pl 

:

Text matched: randomtext   (original string: <font size=5 color="red" face="verdana">randomtext</font>) 
Text matched: randomtext   (original string: <font size=5 face="verdana" color="red">randomtext</font>) 
Text matched: randomtext   (original string: <font color="red" size=5 face="verdana">randomtext</font>) 
Text matched: randomtext   (original string: <font color="red" face="verdana" size=5>randomtext</font>) 
Text matched: randomtext   (original string: <font face="verdana" size=5 color="red">randomtext</font>) 
Text matched: randomtext   (original string: <font face="verdana" color="red" size=5>randomtext</font>) 
+0

위대한 Birei, 당신은 내가 도착한 동일한 해결책에 도착했습니다. 그것은 3 가지 속성을 한 번만 반복하는 유일한 "결함"을 가지고 있습니다. – Imbuter

관련 문제