HTML 태그에서만 견적 마크를 대체하는 정규 표현식
-
20-09-2019 - |
문제
다음 문자열이 있습니다.
<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을 구문 분석하기 위해 Regex를 사용하는 데 지쳐야하지만,이 특별한 경우와 특별한 요구에 대해 Regex가 해결책입니다 ... 올바른 표현을 얻는 데 약간의 도움이 필요합니다.
#2 편집 : Jens는 저를위한 솔루션을 찾는 데 도움을 주었지만이 페이지에 무작위로 오는 사람은이 솔루션을 사용하는 것에 대해 길고 매우 어렵다고 생각해야합니다. 제 경우에는 내가 다룰 줄의 유형에 대해 매우 확신하기 때문에 작동합니다. 나는 위험과 위험을 알고 있으며 당신이 할 수 있습니다. 당신이 알고 있는지 확실하지 않다면 아마도이 방법을 모르고 사용해서는 안된다는 것을 나타냅니다. 당신은 경고를 받았습니다.
해결책
이것은 다음과 같은 방식으로 수행 될 수 있습니다. 모든 인스턴스를 교체하고 싶다고 생각합니다. "
, 그것은 a 사이입니다 <
그리고 a >
~와 함께 '
.
그래서 당신은 각각을 찾습니다 "
파일에서 뒤를 찾으십시오 <
, 그리고 앞서 a >
. regex는 다음과 같습니다.
(?<=\<[^<>]*)"(?=[^><]*\>)
찾은 문자를 원하는 것으로 바꿀 수 있습니다. Regex.Replace
.
참고 : 스택 오버플로 커뮤니티가 가장 친절하고 도움이되는 것을 발견했지만,이 REGEX/HTML 질문은 너무 많은 분노로 응답합니다. 결국,이 질문은 "REGEX가 모든 유효한 HTML과 일치하고 다른 어떤 것과 일치하지 않는지 묻지 않습니다."
다른 팁
당신은 일치 할 수 있습니다 :
(<div.*?id=)"(.*?)"(.*?>)
그리고 이것을 대체합니다.
$1'$2'$3
나는 당신이 이런 종류의 대체물을 수행하기 위해 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 */);