Удалить пробел из всего HTML, но внутри предварительно с регулярными выражениями - PullRequest
2 голосов
/ 06 января 2012

В ASP.NET MVC 3 я создал фильтр действий для удаления пробелов из всего HTML.Он работает, как я ожидал, большую часть времени, но теперь мне нужно изменить RegEx, чтобы не касаться элемента pre.

Я получаю логику RegEx от удивительного Mads Kristensen 's блог, и я не уверен, как изменить это для этой цели.

Вот логика:

public override void Write(byte[] buffer, int offset, int count) {

    string HTML = Encoding.UTF8.GetString(buffer, offset, count);

    Regex reg = new Regex(@"(?<=[^])\t{2,}|(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,11}(?=[<])|(?=[\n])\s{2,}");
    HTML = reg.Replace(HTML, string.Empty);

    buffer = System.Text.Encoding.UTF8.GetBytes(HTML);
    this.Base.Write(buffer, 0, buffer.Length);
}

Весь код фильтра:

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Web/Application/ActionFilters/RemoveWhitespacesAttribute.cs

Есть идеи?

РЕДАКТИРОВАТЬ:

БОЛЬШОЕ ПРИМЕЧАНИЕ:

Мое намерениесовсем не ускорить время отклика .На самом деле, может быть, это все замедляет.Я GZiped страниц, и это минирование заставляет меня получить около 4 - 5 КБ за страницу, что ничего.

Ответы [ 3 ]

5 голосов
/ 07 января 2012

Анализ HTML с помощью регулярных выражений очень сложен, и любые простые решения могут легко сломаться.(Используйте правильный инструмент для работы.) При этом я покажу простое решение.

Сначала я упростил регулярное выражение, которое вы должны были:

(?<=\s)\s+

Замените эти совпадения напустая строка, чтобы избавиться от двойных пробелов везде.

Если в теге pre нет < или >, вы можете добавить (?![^<>]*</pre>) в конце выражения, чтобы оно не сработаловнутри pre тегов.Это гарантирует, что </pre> не следует за текущим соответствием, без каких-либо тегов между ними.

В результате:

<code>(?<=\s)\s+(?![^<>]*
)
0 голосов
/ 06 января 2012

Может быть, разбить его на четыре этапа:

  1. извлекает любые подходящие элементы PRE с помощью регулярных выражений, что-то простое, например "start with <pre>(anything not </pre>)* end with </pre>"
  2. замените каждое из этих совпадений отдельным GUID и сохраните словарь GUID -> pre element html.
  3. удалить пробелы (не влияет на GUID или их размещение.
  4. переберите словарь, который вы сохранили в 2., и верните элементы pre в правильное место.
0 голосов
/ 06 января 2012

Пожалуйста, смотрите очень эпичный RegEx соответствует открытым тегам, за исключением автономных тегов XHTML по всем причинам, по которым регулярные выражения и HTML не ладят.

Если вы используете вышеописанный подход для уменьшения размера страницы, вам определенно следует обратить внимание на сжатие IIS, так как большинство браузеров могут воспользоваться этим, и это будет проще, чем использовать его. Вот как это сделать в IIS 6 и IIS 7:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true

http://technet.microsoft.com/en-us/library/cc771003(WS.10).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...