programing

문자열이 html인지 확인

nasanasas 2020. 9. 17. 07:59
반응형

문자열이 html인지 확인


html인지 아닌지 확인하고 싶은 특정 문자열이 있습니다. 정규식을 동일하게 사용하고 있지만 적절한 결과를 얻지 못했습니다.

내 정규식을 확인했고 여기에서 잘 작동합니다 .

var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)</\1>");
return htmlRegex.test(testString);

여기에 바이올린이 있지만 정규식이 거기에서 실행되지 않습니다. http://jsfiddle.net/wFWtc/

내 컴퓨터에서는 코드가 정상적으로 실행되지만 결과로 true 대신 false가 표시됩니다. 여기에 무엇이 빠졌습니까?


문자열이 HTML인지 확인하는 데 사용하는 더 나은 정규식은 다음과 같습니다.

/^/

예를 들면 :

/^/.test('') // true
/^/.test('foo bar baz') //true
/^/.test('<p>fizz buzz</p>') //true

사실, 그것은 모든 문자열이 HTML 이기 때문에 전달 된 모든 문자열에 true대해 반환 될 정도로 훌륭 합니다. 진지하게, 형식이 잘못되었거나 유효하지 않더라도 여전히 HTML입니다.

원하는 것이 단순히 텍스트 콘텐츠가 아닌 HTML 요소의 존재라면 다음과 같은 내용을 사용할 수 있습니다.

/<\/?[a-z][\s\S]*>/i.test()

어떤 식 으로든 HTML을 구문 분석하는 데 도움이되지는 않지만 확실히 문자열에 HTML 요소가 포함 된 것으로 플래그를 지정합니다.


방법 # 1 . 다음은 문자열에 HTML 데이터가 포함되어 있는지 테스트하는 간단한 함수입니다.

function isHTML(str) {
  var a = document.createElement('div');
  a.innerHTML = str;

  for (var c = a.childNodes, i = c.length; i--; ) {
    if (c[i].nodeType == 1) return true; 
  }

  return false;
}

아이디어는 브라우저 DOM 파서가 제공된 문자열이 HTML처럼 보이는지 여부를 결정할 수 있도록하는 것입니다. 보시다시피 단순히 ELEMENT_NODE( nodeTypeof 1)을 확인합니다 .

몇 가지 테스트를했고 작동하는 것처럼 보입니다.

isHTML('<a>this is a string</a>') // true
isHTML('this is a string')        // false
isHTML('this is a <b>string</b>') // true

이 솔루션은 HTML 문자열을 올바르게 감지하지만 img / vide / etc와 같은 부작용이 있습니다. innerHTML에서 파싱되면 태그가 리소스 다운로드를 시작합니다.

방법 # 2 . 또 다른 방법은 DOMParser를 사용하며 로드 리소스 부작용이 없습니다.

function isHTML(str) {
  var doc = new DOMParser().parseFromString(str, "text/html");
  return Array.from(doc.body.childNodes).some(node => node.nodeType === 1);
}

참고 :
1. Array.fromES2015 방법이며 [].slice.call(doc.body.childNodes).
2. some호출중인 화살표 기능 을 일반적인 익명 기능으로 대체 할 수 있습니다.


다음을 통한 약간의 유효성 검사 :

/<(?=.*? .*?\/ ?>|br|hr|input|!--|wbr)[a-z]+.*?>|<([a-z]+).*?<\/\1>/i.test(htmlStringHere) 

이것은 빈 태그 (일부 미리 정의 됨) 및 /종료 된 XHTML 빈 태그를 검색하고 빈 태그 로 인해 HTML로 유효성을 검사합니다. 또는 태그 이름을 캡처하고 HTML로 유효성을 검사하기 위해 문자열에서 닫는 태그를 찾으려고 시도합니다.

데모 설명 : http://regex101.com/r/cX0eP2

최신 정보:

다음을 통한 완전한 검증 :

/<(br|basefont|hr|input|source|frame|param|area|meta|!--|col|link|option|base|img|wbr|!DOCTYPE).*?>|<(a|abbr|acronym|address|applet|article|aside|audio|b|bdi|bdo|big|blockquote|body|button|canvas|caption|center|cite|code|colgroup|command|datalist|dd|del|details|dfn|dialog|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frameset|head|header|hgroup|h1|h2|h3|h4|h5|h6|html|i|iframe|ins|kbd|keygen|label|legend|li|map|mark|menu|meter|nav|noframes|noscript|object|ol|optgroup|output|p|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video).*?<\/\2>/i.test(htmlStringHere) 

This does proper validation as it contains ALL HTML tags, empty ones first followed by the rest which need a closing tag.

Explained demo here: http://regex101.com/r/pE1mT5


zzzzBov's answer above is good, but it does not account for stray closing tags, like for example:

/<[a-z][\s\S]*>/i.test('foo </b> bar'); // false

A version that also catches closing tags could be this:

/<[a-z/][\s\S]*>/i.test('foo </b> bar'); // true

Here's a sloppy one-liner that I use from time to time:

var isHTML = RegExp.prototype.test.bind(/(<([^>]+)>)/i);

It will basically return true for strings containing a < followed by ANYTHING followed by >.

By ANYTHING, I mean basically anything except an empty string.

It's not great, but it's a one-liner.

Usage

isHTML('Testing');               // false
isHTML('<p>Testing</p>');        // true
isHTML('<img src="hello.jpg">'); // true
isHTML('My < weird > string');   // true (caution!!!)
isHTML('<>');                    // false

As you can see it's far from perfect, but might do the job for you in some cases.


All of the answers here are over-inclusive, they just look for < followed by >. There is no perfect way to detect if a string is HTML, but you can do better.

Below we look for end tags, and will be much tighter and more accurate:

import re
re_is_html = re.compile(r"(?:</[^<]+>)|(?:<[^<]+/>)")

And here it is in action:

# Correctly identified as not HTML:
print re_is_html.search("Hello, World")
print re_is_html.search("This is less than <, this is greater than >.")
print re_is_html.search(" a < 3 && b > 3")
print re_is_html.search("<<Important Text>>")
print re_is_html.search("<a>")

# Correctly identified as HTML
print re_is_html.search("<a>Foo</a>")
print re_is_html.search("<input type='submit' value='Ok' />")
print re_is_html.search("<br/>")

# We don't handle, but could with more tweaking:
print re_is_html.search("<br>")
print re_is_html.search("Foo &amp; bar")
print re_is_html.search("<input type='submit' value='Ok'>")

If you're creating a regex from a string literal you need to escape any backslashes:

var htmlRegex = new RegExp("<([A-Za-z][A-Za-z0-9]*)\\b[^>]*>(.*?)</\\1>");
// extra backslash added here ---------------------^ and here -----^

This is not necessary if you use a regex literal, but then you need to escape forward slashes:

var htmlRegex = /<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)<\/\1>/;
// forward slash escaped here ------------------------^

Also your jsfiddle didn't work because you assigned an onload handler inside another onload handler - the default as set in the Frameworks & Extensions panel on the left is to wrap the JS in an onload. Change that to a nowrap option and fix the string literal escaping and it "works" (within the constraints everybody has pointed out in comments): http://jsfiddle.net/wFWtc/4/

As far as I know JavaScript regular expressions don't have back-references. So this part of your expression:

</\1>

won't work in JS (but would work in some other languages).


/<\/?[^>]*>/.test(str) Only detect whether it contains html tags, may be a xml


With jQuery:

function isHTML(str) {
  return /^<.*?>$/.test(str) && !!$(str)[0];
}

Using jQuery in this case, the simplest form would be:

if ($(testString).length > 0)

If $(testString).length = 1, this means that there is one HTML tag inside textStging.

참고URL : https://stackoverflow.com/questions/15458876/check-if-a-string-is-html-or-not

반응형