2013-01-04 2 views
1

나는 펄 정규 표현식 대체에 유능하지만, 나는 녹슨듯한 느낌이 들지만, 이것은 보통하지 않는다. & 문자를 XML로 이스케이프하지만 이미 이스케이프 처리 된 문자로 &을 대체하는 것을 방지합니다. 그것은 그것의 오른쪽에있는 문자를 삭제하거나 대체하는 것을 제외하고는 잘 동작하는 것 같습니다. 내가 뭘 놓치고 있니?펄 정규식 대체 1 너무 많은 문자를 대체

$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g; 

답변

6

네가티브 문자 클래스를 negative look-ahead으로 착각합니다.

귀하의 정규식 정말 의미

/&[^#39aglmopqtu;|]/ # mixed a few letters and removed duplicates 

하지만 의미 :

/&(?!amp;|lt;|gt;|quot;|#39;)/ 

광장 bracktes 그룹화하지, 문자 클래스를 나타냅니다! 당신이 정말로 XML 엔티티를 일치하지 않도록하려면

이 문서, 또는 참조 된 DTD에 의해 선언 된 모든 엔티티를 추가, 당신은 오히려

m{& (?! (?: 
    (?:\#[0-9]+) 
    |(?:\#x[0-9a-fA-F]+) 
    |(?:[lg]t|amp|apos|quot) # predefined XML entities 
);)}x 

같은 정규 표현식을 사용한다 어떻게 든합니다 (XML spec 비교)합니다.

+0

흠 ... 나는 따라 잡기 위해 몇 가지 있습니다! 두 가지 솔루션 모두 작동합니다. 모두에게 감사드립니다! – ThorInSuburbia

2

너비가 0 인 음수 미리보기가 필요합니다. 뭔가 같은

$str =~ s/&(?!amp;|lt;|gt;|quot;|#39;)/&/g; 
+0

우수! 감사! – ThorInSuburbia