Пример HTML-кода:
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
Я хочу использовать RegEx для извлечения информации о наборе символов (т.е. здесь, это - "utf-8"),
(Я использую C#),
Этот regex:
<meta.*?charset=([^"']+)
Должен работать. Использование парсера XML для извлечения этого является излишеством.
Я склонен согласиться с @You, однако я дам вам ответ, который вы запрашиваете, а также некоторые другие решения.
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];
В любом случае любой из вышеперечисленных должен работать, однако определенно команды String.Split могут быть опасными без предварительной проверки, чтобы увидеть, есть ли в массиве данные, поэтому, возможно, вы захотите выйти из вышеперечисленного, иначе вы получите NullException.
Для PHP:
$charset = preg_match('/charset=([a-zA-Z0-9-]+)/', $line); $charset = $charset[1];
Не используйте регулярные выражения для синтаксического анализа (X) HTML ! Используйте подходящий инструмент, например парсер SGML или XML. Ваш код выглядит как XHTML, поэтому я бы попробовал синтаксический анализатор XML. Однако после получения атрибута из метаэлемента; регулярное выражение было бы более подходящим. Хотя просто разделение строки на ;
, безусловно, поможет (и быстрее).
Мое регулярное выражение:
<meta[^>]*?charset=([^"'>]*)
Мой тестовый пример:
<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 # -код:
using System.Text.RegularExpressions;
string resultString = Regex.Match(sourceString, "<meta[^>]*?charset=([^\"'>]*)").Groups[1].Value;
RegEx-Описание:
// <meta[^>]*?charset=([^"'>]*)
//
// Match the characters "<meta" literally «<meta»
// Match any character that is not a ">" «[^>]*?»
// Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
// Match the characters "charset=" literally «charset=»
// Match the regular expression below and capture its match into backreference number 1 «([^"'>]*)»
// Match a single character NOT present in the list ""'>" «[^"'>]*»
// Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Я пробовал с помощью javascript поместить вашу строку в переменную и выполнить сопоставление:
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]);