How to use Regular Expression to match the charset string in HTML?

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

HTML code example:

<meta http-equiv="Content-type" content="text/html;charset=utf-8" /> 

I want to use RegEx to extract the charset information (i.e. here, it's "utf-8")

(I'm using C#)

回答1:

This regex:

<meta.*?charset=([^"']+) 

Should work. Using an XML parser to extract this is overkill.



回答2:

My answer provides a more robust version of @Floyd's and, to the degree possible, addresses @You's breakage test case, where a negative lookahead is used to avoid it. There's really only one relevant case I can think of (a variant of @You's example) where it will give a false positive, but I think it would be pretty rare. Expressions are expected to be run with the case-insensitive flag and were tested using java.util.regex and JRegex.

Capture groups are automatically trimmed and never include quotes, nor other tag chars like "/" or ">". In the second expression, there are 2 capture groups; the first being the content-type value, which may be empty (i.e., when using charset attribtue), and the second being the charset value, which will always be non-empty (unless the charset value is literally left empty for some odd reason).

Regex for matching/grouping charset value only - trimmed, skips quotes

<meta(?!\s*(?:name|value)\s*=)[^>]*?charset\s*=[\s"']*([^\s"'/>]*) 

Same as above, but also matches/groups content-type (optional) and charset (required) values, trimmed, skips quotes. Minor caveat - Misses matching standalone content type value, i.e., "text/html"

<meta(?!\s*(?:name|value)\s*=)(?:[^>]*?content\s*=[\s"']*)?([^>]*?)[\s"';]*charset\s*=[\s"']*([^\s"'/>]*) 

Test cases (all pass except the very last one)...

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> <meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1'/> <meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1' /> <meta http-equiv=Content-Type content=text/html;charset=iso-8859-1/> <meta http-equiv=Content-Type content=text/html;charset=iso-8859-1 /> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" > <meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1'> <meta http-equiv='Content-Type' content='text/html;charset=iso-8859-1' > <meta http-equiv=Content-Type content=text/html;charset=iso-8859-1> <meta http-equiv=Content-Type content=text/html;charset=iso-8859-1 >  <meta http-equiv="Content-Type" content="text/html;charset='iso-8859-1'"> <meta http-equiv="Content-Type" content="'text/html;charset=iso-8859-1'"> <meta http-equiv="Content-Type" content="'text/html';charset='iso-8859-1'"> <meta http-equiv='Content-Type' content='text/html;charset="iso-8859-1"'> <meta http-equiv='Content-Type' content='"text/html;charset=iso-8859-1"'> <meta http-equiv='Content-Type' content='"text/html";charset="iso-8859-1"'>  <meta http-equiv="Content-Type" content="text/html;;;charset=iso-8859-1"> <meta http-equiv="Content-Type" content="text/html;;;charset='iso-8859-1'"> <meta http-equiv="Content-Type" content="'text/html;;;charset=iso-8859-1'"> <meta http-equiv="Content-Type" content="'text/html';;;charset='iso-8859-1'"> <meta http-equiv='Content-Type' content='text/html;;;charset=iso-8859-1'> <meta http-equiv='Content-Type' content='text/html;;;charset="iso-8859-1"'> <meta http-equiv='Content-Type' content='"text/html;;;charset=iso-8859-1"'> <meta http-equiv='Content-Type' content='"text/html";;;charset="iso-8859-1"'>  <meta  http-equiv  =  "  Content-Type  "  content  =  "  '  text/html  '  ;  ;;  '  ;  '  '  ;  '  ;  ' ;;  ;  charset  =  '  iso-8859-1  '  "  > <meta  content  =  "  '  text/html  '  ;  ;;  '  ;  '  '  ;  '  ;  ' ;;  ;  charset  =  '  iso-8859-1  '  "  http-equiv  =  "  Content-Type  "  > <meta  http-equiv  =  Content-Type  content  =  text/html;charset=iso-8859-1  > <meta  content  =  text/html;charset=iso-8859-1  http-equiv  =  Content-Type  > <meta  http-equiv  =  Content-Type  content  =  text/html  ;  charset  =  iso-8859-1  > <meta  content  =  text/html  ;  charset  =  iso-8859-1  http-equiv  =  Content-Type  > <meta  http-equiv  =  Content-Type  content  =  text/html  ;;;  charset  =  iso-8859-1  > <meta  content  =  text/html  ;;;  charset  =  iso-8859-1  http-equiv  =  Content-Type  > <meta  http-equiv  =  Content-Type  content  =  text/html  ;  ;  ;  charset  =  iso-8859-1  > <meta  content  =  text/html  ;  ;  ;  charset  =  iso-8859-1  http-equiv  =  Content-Type  >  <meta charset="utf-8"/> <meta charset="utf-8" /> <meta charset='utf-8'/> <meta charset='utf-8' /> <meta charset=utf-8/> <meta charset=utf-8 /> <meta charset="utf-8"> <meta charset="utf-8" > <meta charset='utf-8'> <meta charset='utf-8' > <meta charset=utf-8> <meta charset=utf-8 >  <meta  charset  =  "  utf-8  "  > <meta  charset  =  '  utf-8  '  > <meta  charset  =  "  utf-8  '  > <meta  charset  =  '  utf-8  "  > <meta  charset  =  "  utf-8     > <meta  charset  =  '  utf-8     > <meta  charset  =     utf-8  '  > <meta  charset  =     utf-8  "  > <meta  charset  =     utf-8     > <meta  charset  =     utf-8    />  <meta name="title" value="charset=utf-8 ― is it really useful (yep)?"> <meta value="charset=utf-8 ― is it really useful (yep)?" name="title"> <meta name="title" content="charset=utf-8 ― is it really useful (yep)?"> <meta name="charset=utf-8" content="charset=utf-8 ― is it really useful (yep)?">  <meta content="charset=utf-8 ― is it really useful (nope, not here, but gotta admit pretty robust otherwise)?" name="title"> 


回答3:

I tried with javascript placing your string in a variable and doing a match:

var x = '<meta http-equiv="Content-type" content="text/html;charset=utf-8" />'; var result = x.match(/charset=([a-zA-Z0-9-]+)/); alert(result[1]); 


回答4:

For PHP:

$charset = preg_match('/charset=([a-zA-Z0-9-]+)/', $line); $charset = $charset[1];


回答5:

My regex:

<meta[^>]*?charset=([^"'>]*) 

My testcase:

<meta http-equiv="Content-type" content="text/html;charset=utf-8" /> <meta name="author" value="me"><!-- Maybe we should have a charset=something meta element? --><meta charset="utf-8"> 

C#-Code:

using System.Text.RegularExpressions; string resultString = Regex.Match(sourceString, "<meta[^>]*?charset=([^\"'>]*)").Groups[1].Value; 

RegEx-Description:



回答6:

I tend to agree with @You however I'll give you the answer you request plus some other solutions.

        String meta = "<meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" />";         String charSet = System.Text.RegularExpressions.Regex.Replace(meta,"<meta.*charset=([^\\s'\"]+).*","$1");          // if meta tag has attributes encapsulated by double quotes         String charSet = ((meta.Split(new String[] { "charset=" }, StringSplitOptions.None))[1].Split('"'))[0];         // if meta tag has attributes encapsulated by single quotes         String charSet = ((meta.Split(new String[] { "charset=" }, StringSplitOptions.None))[1].Split('\''))[0]; 

Either way any of the above should work, however definitely the String.Split commands can be dangerous without first checking to see if the array has data, so might want to break out the above otherwise you'll get a NullException.



回答7:

This regular expression will capture the charset value itself from any meta tag:

(?<=([<META|<meta])(.*)charset=)([^"'>]*) 

Example input:

<meta http-equiv=Content-Type content="text/html; charset=windows-1252"> <meta http-equiv=Content-Type content=text/html; charset=windows-1252> <meta http-equiv=Content-Type content='text/html; charset=windows-1252'> <meta http-equiv="Content-type" content="text/html;charset=utf-8" />  <meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />  

Use it like this:

Regex regexObj = new Regex("(?<=<meta(.*)charset=)([^\"'>]*)", RegexOptions.IgnoreCase); Match matchResults = regexObj.Match(subjectString); while (matchResults.Success) {     for (int i = 1; i < matchResults.Groups.Count; i++) {         Group groupObj = matchResults.Groups[i];         if (groupObj.Success) {             // matched text: groupObj.Value             // match start: groupObj.Index             // match length: groupObj.Length         }      }     matchResults = matchResults.NextMatch(); }  

Will find these values:

windows-1252

windows-1252

windows-1252

utf-8

iso-8859-1



回答8:

Try also :

<meta(?!\s*(?:name|value)\s*=)[^>]*?charset\s*=[\s"']*([a-zA-Z0-9-]+)[\s"'\/]*> 


回答9:

Don't use regular expressions to parse (X)HTML! Use a proper tool, i.e. a SGML or XML parser. Your code looks like XHTML, so I'd try an XML parser. After getting the attribute from the meta element, however; a regex would be more appropriate. Although, just a string split at ; would certainly do the trick (and faster, too).



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!