Как использовать Регулярное выражение для соответствия строке набора символов в HTML?

Пример HTML-кода:

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

Я хочу использовать RegEx для извлечения информации о наборе символов (т.е. здесь, это - "utf-8"),

(Я использую C#),

8
задан silent 11 August 2010 в 12:42
поделиться

6 ответов

Этот regex:

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

Должен работать. Использование парсера XML для извлечения этого является излишеством.

8
ответ дан 5 December 2019 в 07:10
поделиться

Я склонен согласиться с @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.

0
ответ дан 5 December 2019 в 07:10
поделиться

Для PHP:

$charset = preg_match('/charset=([a-zA-Z0-9-]+)/', $line);
$charset = $charset[1];
0
ответ дан 5 December 2019 в 07:10
поделиться

Не используйте регулярные выражения для синтаксического анализа (X) HTML ! Используйте подходящий инструмент, например парсер SGML или XML. Ваш код выглядит как XHTML, поэтому я бы попробовал синтаксический анализатор XML. Однако после получения атрибута из метаэлемента; регулярное выражение было бы более подходящим. Хотя просто разделение строки на ; , безусловно, поможет (и быстрее).

-1
ответ дан 5 December 2019 в 07:10
поделиться

Мое регулярное выражение:

<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) «*»
0
ответ дан 5 December 2019 в 07:10
поделиться

Я пробовал с помощью 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]);
0
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: