2009-09-02 4 views
2

문자열이 있습니다. 이 아닌 더 큰 문자를 모두 찾으려면 HTML 태그를 사용해야합니다.너비가 0 인 긍정적 인 lookbehind 어설 션으로 정규 표현식에 문제가 발생했습니다

CDATA 등을 무시하면 쉽습니다. 앞에 "<"이 없거나 그 사이에 다른 ">"가없는 ">"문자를 찾으십시오. 나는이가 중, 어떤 ">"바로 왼쪽에는 "<"문자가없는 경우 다시 찾아야한다 생각

(?<=(^|>)[^<]*)> 

: 여기

내가 생각 해낸 최초의 시도 솔루션입니다 문자열의 시작 부분, 또는 이전의 ">"부분으로 되돌아갑니다.

나는 부정적으로뿐만 아니라 그것을 같이 분석 시도 :

(?<!<[^>]*)> 

즉 ">"그 만이 아닌 다음에하지 않는도 아니다 "<"로 시작되는 - ">"문자.

나는 내가 머리를 기울이면 어떻게 보이게 작동하는지에 대해 의심 스럽다.

단위 테스트 :

No match in: <foo> 
No match in: <foo bar> 
Match in: <foo> bar> 
Match in: foo> bar 
Match in: >foo 
Two matches in: foo>> 
Two matches in: <foo> >bar> 

사용 사례 : 나는 일부 HTML 태그를 받아들이는 위키 같은 양식 필드에서 HTML을 닦고 있어요,하지만 사용자가 아닌 정말 HTML에 정통한 때로는 이스케이프 입력 " > "및"< "리터럴을 의미합니다. 내 의도는 HTML 태그의 일부가 아닌 경우에만 HTML 엔터티로 대체하는 것입니다. "Heigh is < 10 and> 5"와 같은 텍스트를 입력 할 가능성이 있다는 것을 알고 있습니다.이 문제는이를 해결할 수 있지만, 해결할 수있는 가장 중요한 경우입니다.

+0

'(? ) *)>' –

+0

죄송합니다. Brad는 작동하지 않습니다. – richardtallent

+0

어쨌든 가치있는 시도. –

답변

0

프레소 오기 작업을하고 당신이 무엇을해야 하나를 쓸 수 있다면하지만, 나도 몰라 솔직히 말해서 정규 표현식에

작성을위한 훌륭한 도구.
일부 html 태그는 유효한 html로 닫히지 않아도되며, 일부는 xhtml에서 자동으로 닫히지 않는 것을 잊지 마십시오.

eg. <hr>, <br/>, <p>, <li> <img> or <img /> etc 

당신은 그냥 유효한 태그 목록을 유지 모든 <를 변경하고, 더 나을 수 있습니다> 유효한 태그의 일부가 아닌 &lt;&gt; 표지판.

+0

이 답변은 [언급 된 도구에 대한 링크] [1]를 제공하면 더 나을 것입니다. [1] : http://www.ultrapico.com/Expresso.htm – jwfearn

3

처음 보는 것보다 훨씬 까다 롭습니다 (발견하는대로). 하나의 정규식을 사용하여 HTML 태그 또는 꺾쇠 괄호를 일치시키는 것이 훨씬 쉬운 방법입니다. 찾은 태그 인 경우 다시 연결합니다. 그렇지 않으면 그것을 변환합니다. MatchEvaluator 매개 변수를 바꾸기 방법은 좋은 것입니다 : 당신은 내 태그 정규식 것을 알 수 있습니다

static string ScrubInput(string input) 
{ 
    return Regex.Replace(input, @"</?\w+>|[<>]", GetReplacement); 
} 

static string GetReplacement(Match m) 
{ 
    switch (m.Value) 
    { 
    case "<": 
     return "&lt;"; 
    case ">": 
     return "&gt;"; 
    default: 
     return m.Value; 
    } 
} 

-</?\w+>이 - 당신보다 더 제한적입니다. 내 것이 정확히 필요한지는 모르겠지만, <[^<>]+>을 사용하지 말 것을 권장합니다. "if (x<3||x>9)"과 같은 것을 찾을 수 있습니다.

관련 문제