문제

RichText 편집기를 통해 사용자가 입력 한 HTML 컨텐츠가 있으므로 거의 모든 것이 될 수 있습니다 (신체 태그 외부에 있지 않아야 할 것, "머리"또는 문서 등에 대한 걱정이 없음). 이 콘텐츠의 예 :

<h1>Header 1</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />
<h1>Header 2</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />

트릭은 텍스트의 첫 100 자만 추출해야한다는 것입니다 (HTML 태그가 벗겨 졌음). 또한 라인 브레이크를 유지하고 단어를 깨지 않아야합니다.

따라서 위의 출력은 다음과 같습니다.

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

98자가 있으며 라인 브레이크가 유지됩니다. 지금까지 달성 할 수있는 것은 Regex를 사용하여 모든 HTML 태그를 제거하는 것입니다.

Regex.Replace(htmlStr, "<[^>]*>", "")

그런 다음 Regex를 사용하여 길이를 다음과 같이 다듬습니다.

Regex.Match(textStr, @"^.{1,100}\b").Value

내 문제는 라인 브레이크를 유지하는 방법입니다. 나는 다음과 같은 출력을 얻는다 :

Header 1
Some text hereSome more text here
A link here
Header 2
Some text hereSome more text

가입 문장을 주목하십니까? 아마도 누군가 가이 문제를 해결하는 다른 방법을 보여줄 수있을 것입니다. 감사!

추가 정보: 저의 목적은 많은 HTML 컨텐츠에서 일반 텍스트 시놉시스를 생성하는 것입니다. 이것이이 문제를 명확히하는 데 도움이 될 것 같아요.

도움이 되었습니까?

해결책 4

글쎄, 나는 이상적인 솔루션이 없지만 이것을 닫아야합니다. 내 앱에 사용 된 HTML 태그는 중첩이 거의 없거나 전혀없는 매우 일반적인 태그 (테이블, 목록 등)이므로 사용자 입력 후 저장하기 전에 HTML 조각을 미리 형성하는 것입니다.

  • 모든 라인 브레이크를 제거하십시오
  • 모든 블록 태그에 라인 브레이크 접두사 추가 (예 : Div, P, HR, H1/2/3/4 등)

평범한 텍스트로 표시되도록 추출하기 전에 Regex를 사용하여 HTML 태그를 제거하고 라인 브레이크를 유지하십시오. 로켓 과학은 거의 없지만 나를 위해 일합니다.

다른 팁

나는 이것을 어떻게 해결할 것인가가 간단한 브라우저 인 것처럼 보는 것이라고 생각합니다. 기본 태그 클래스를 만들고 내부 html 속성과 가상 메소드 인쇄물로 추상화하십시오.

다음으로, 귀하가 관심을 갖고 기본 클래스에서 상속하는 각 HTML 태그에 대한 클래스를 작성하십시오. 예에서 가장 관심이있는 태그는 H1, P, A 및 HR입니다. InnerHTML을 기반으로 요소를 올바르게 인쇄하는 문자열을 반환하는 PrintElement 메소드를 구현합니다 (예 : P Class 'PrintElement는 " n [innerHtml] n")를 반환합니다.

다음으로, HTML을 구문 분석하고 어떤 개체를 만들 었는지 결정한 다음 해당 객체를 큐에 추가하는 구문 분석기를 작성하십시오 (나무가 더 좋지만 목적에 필요한 것처럼 보이지는 않습니다).

마지막으로, 각 요소의 printelement 메소드를 호출하는 대기열을 통과하십시오.

당신이 계획 한 것보다 더 많은 작업 일지 모르지만, 그것은 단순히 Regex를 사용하는 것보다 훨씬 강력한 솔루션이므로 앞으로 마음을 바꾸기로 결정하고 간단한 스타일을 보여주기를 원한다면 인쇄 방법을 수정하고 수정하는 문제 일뿐입니다.

정보를 위해, html을 정규식으로 박탈하는 것은 미묘한 문제로 가득합니다. 그만큼 HTML 민첩성 팩 더 강력 할 수 있지만 여전히 함께 출혈하는 단어로 고통받습니다.

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.InnerText;

한 가지 방법은 HTML을 세 단계로 제거하는 것입니다.

Regex.Replace(htmlStr, "<[^/>]*>", "") // don't strip </.*>
Regex.Replace(htmlStr, "</p>", "\r\n") // all paragraph ends are replaced w/ new line
Regex.Replace(htmlStr, "<[^>]*>", "") // replace remaining </.*>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top