HTML 태그에서만 따옴표를 대체하는 정규 표현식

asp.net c# html-agility-pack regex

문제

다음 문자열이 있습니다.

<div id="mydiv">This is a "div" with quotation marks</div>

정규 표현식을 사용하여 다음을 반환하고자합니다.

<div id="mydiv">This is a "div" with quotation marks</div>

div의 id 속성이 어포 스트로피로 둘러싸인 방법에 주목하십시오.

정규 표현식으로 어떻게 할 수 있습니까?

편집 : 모든 상황에서 모든 엣지 케이스를 처리 할 수있는 마법의 탄환을 찾는 것이 아닙니다. 우리는 HTML을 파싱하기 위해 정규 표현식을 사용하는 것에 모두 지쳐 있어야하지만,이 특별한 경우에는 정규 표현식이 솔루션입니다 ... 올바른 표현을 얻는 데 약간의 도움이 필요합니다.

편집 # 2 : Jens는 나를위한 솔루션을 찾는데 도움이되었지만 임의로이 페이지를 방문하는 사람은이 솔루션을 사용하는 것에 대해 오랫동안 열심히 생각해야합니다. 내 경우에는 내가 다루어야 할 문자열 유형에 대해 매우 확신하기 때문에 작동한다. 나는 그 위험과 위험을 안다. 확실하지 않은 경우이 정보를 알고 있다면이 방법을 모른다는 것을 나타내며 사용하지 않아야합니다. 너는 경고 당했다.

수락 된 답변

이것은 다음과 같은 방법으로 수행 할 수 있습니다 : 당신의 모든 인스턴스를 교체 할 생각 " , 그건 사이에 <>' .

그래서, 당신은 각각의 " 파일을 찾고, 뒤에서 < 찾은 다음에 > 찾습니다. 정규식은 다음과 같습니다.

(?<=\<[^<>]*)"(?=[^><]*\>)

찾을 수있는 문자를 원하는대로 바꿀 수 있습니다. Regex.Replace 사용하면됩니다.

참고 : 스택 오버플로 커뮤니티가 가장 친숙하고 도움이되는 동안이 Regex / HTML 질문은 너무 많은 분노로 반응합니다. 결국이 질문은 "정규식이 모든 유효한 HTML과 일치하며 다른 것과 일치하지 않습니다."라는 질문을하지 않습니다.


인기 답변

Regex를 사용하여 이러한 종류의 대체 작업을 수행 할 때 발생할 수있는 위험에 대해 알고 있습니다. 입력 문서 변경으로 계속 작동하는 솔루션을 원한다면 훨씬 더 안정적인 방법을 찾는 사람들에게 다음과 같은 대답을 추가했습니다.

HTML 민첩성 팩 ( 프로젝트 페이지 , 너겟 )을 사용하면 다음과 같은 트릭을 수행합니다.

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.