Использование регулярного выражения для обрезки HTML - PullRequest
1 голос
/ 02 июня 2009

Некоторое время пытались решить эту проблему.

Мне нужно регулярное выражение, чтобы убрать символы новой строки, табуляции и пробелы между тегами html, показанными в следующем примере:

Источник:

<html>
   <head>
     <title>
           Some title
       </title>
    </head>
</html>

Требуемый результат:

<html><head><title>Some title</title></head></html>

Обрезка пробелов перед «Некоторым заголовком» не обязательна. Буду благодарен за любую помощь

Ответы [ 9 ]

20 голосов
/ 02 июня 2009

Если HTML строгий, загрузите его с помощью программы чтения XML и запишите обратно без форматирования. Это сохранит пробелы в тегах, но не между ними.

1 голос
/ 03 июня 2009

\ d не соответствует только [0-9] в Perl 5.8 и 5.10; он соответствует любому символу UNICODE, который имеет цифровой символ (включая «\ x {1815}» и «\ x {FF15}»). Если вы имеете в виду [0-9], вы должны либо использовать [0-9], либо использовать прагму bytes (но она превращает все строки в однобайтовые символы и, как правило, это не то, что вам нужно).

Регулярные выражения в корне плохо разбирают HTML (см. Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

Вам может пригодиться ответ HTMLAgilityPack .

0 голосов
/ 29 августа 2012

Решение с XSLT будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">    
<xsl:output  method="xml" encoding="UTF-8" indent="no"/>

<xsl:template match="*|@*">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<!-- trim whitespaces from the content -->
<xsl:template match="text()">
    <!-- remove from tag to content -->
    <xsl:variable name="trimmedHead" select="replace(.,'^\s+','')"/>
    <xsl:variable name="trimmed" select="replace($trimmedHead,'\s+$','')"/>
    <xsl:value-of select="$trimmed"/>
</xsl:template>

<!-- do not trim where text content exist -->
<xsl:template match="text()">
    <xsl:if test="not(matches(.,'^\s+$'))">
        <xsl:value-of select="."/>
    </xsl:if>
</xsl:template>

Вы можете выбрать шаблон, который хотите использовать. Первый удаляет все пробелы также, когда контент существует, а второй удаляет только тогда, когда есть только пробелы или переводы строки.

0 голосов
/ 17 июня 2010
Regex.Replace(input, "<[^>]*>", String.Empty);
0 голосов
/ 14 июня 2010

Я хотел сохранить новые строки, так как удаление новых строк испортило мой html. Итак, я пошел со следующим. .

private static string ProcessHTMLFile(string input)
{
    string opt = Regex.Replace(input, @"(  )*", "", RegexOptions.Singleline);
    opt = Regex.Replace(opt, @"[\t]*", "", RegexOptions.Singleline);
    return opt;
}
0 голосов
/ 02 июня 2009

Удаляет пробелы между тегами и пространство между тегами и текстом.

s/(\s*(<))|((>)\s*)/\2\4/g
0 голосов
/ 02 июня 2009

s/\s*(<[^>]+>)\s*/\1/gs

или, в c #:

Regex.Replace(html, "\s*(<[^>]+>)\s*", "$1", RegexOptions.SingleLine);

0 голосов
/ 02 июня 2009

s/>\s+</></gs

0 голосов
/ 02 июня 2009

Попробуйте это:

s/[^\w\/\d<>]+/gs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...