2013-07-19 2 views
0

I 작동하는 다음 코드 조각이 : (표준 텍스트 문자열)정규식은 따옴표 사이의 문자열을 캡처

($txid) = $content =~ m/ start (.*) stop /; 
print $txid; 

하지 않고 다음 코드 조각 (인용 부호 문자열)

($txid) = $content =~ m/<input name="transactionid" value="(.*)" type="hidden">/; 
print $txid; 

따옴표로 인해 문제가 발생한 것으로 생각됩니다. 아무도 내가 이것을 해결할 수있는 방법을 알고 있습니까?

+0

문제는 확률이 높지 만 따옴표로 묶이지 않을 가능성이 큽니다. (a) 정규 표현식으로 HTML을 파싱하지 마십시오. 이것은 취약한 솔루션을 생성합니다. (b) 당신은 어떤 자료를 가지고 있습니까? 예제를 보여주십시오. – amon

+0

[''작동하지 않습니다.''] (http://tlp-perl.blogspot.se/2013/06/its-not-working.html)는 문제를 설명하는 좋은 방법이 아닙니다. – TLP

+0

입력은 여기에 입력하는 방법으로 큽니다, 그것은 HTML의 웹 페이지입니다. 첫 번째 방금 "hello"를 올바르게 반환 한 문자열 "hello stop 시작"을 수행했습니다. 두 번째 것은 빈 변수를 반환합니다. 나는 체크했다. 그리고 $ content는 정확한 데이터로 채워져있다, 나는 단지 숨겨진 필드 "transactionid"의 값을 얻어야한다. – user1796225

답변

0

기본적으로 * 한정 기호는 "greedy"입니다. 즉, (.*)은 가능한 모든 것을 의미합니다. 이 같은이 가능한 한 적은 일치하도록 제한하려면, 즉 단지 문자열에서 발생하는 다음 따옴표까지, 따라서 그것에 ?을 추가하십시오 value 속성의 값을 가정

($txid) = $content =~ m/<input name="transactionid" value="(.*?)" type="hidden">/; 

없이 포함되어 있습니다 이중 따옴표를 이스케이프하면 결과가 생성됩니다.

가 (물론, 따옴표를 이스케이프가있는 경우에, 안정적으로 관심과 아무것도 단지 문자열을 추출합니다에는 정규식이 없습니다. 이것은 사람들이 당신이 당신의 유일한 도구로 정규 표현식에 사용하지 않는 말할 이유 다른 한편으로는 여기에 목적의 단순성이 주어지면 아마 그걸 가지고 도망 갈 수있을 것이지만, 무엇이든간에, 무엇이든은 약간 더 복잡한 HTML 또는 XML 처리가 필요합니다. 이보다 XML 파서를 사용하십시오.

+0

감사합니다. – user1796225

+0

@ user1796225 도움이되기를 기뻐합니다. 즉, HTML을 구문 분석하기 위해 정규 표현식을 사용하는 것에 대한 경고는 수년간의 맹세, 모발 당김 및 일반화 된 불행의 결과이며, 이들을 준수 할 것을 매우 잘 권고합니다. 당신은 아주 간단한 문제가 있기 때문에 여기에서 벗어날 수 있습니다. 귀하의 요구 사항이 약간 더 복잡하다면, 대신 HTML :: TreeBuilder 예제를 제공했을 것입니다. 물론이 조언을 무시해도 좋습니다.하지만 위험에 처해 있습니다. –

+0

문제 없으므로 양해 해 주시면 감사하겠습니다. 당신이 말했듯이, 그것은 하나의 간단한 작업이고 그것은 소프트웨어 전체에서 HTML을 구문 분석 할 필요가있는 유일한 시간입니다. 앞으로 HTML을 파싱 할 때마다이 조언을 염두에 두겠다. :-) – user1796225

관련 문제