REGEX только для данных и конечного тега - PullRequest
0 голосов
/ 08 сентября 2010

Я ищу REGEX, который даст мне данные вместе с конечным тегом

, например

input:
-----------------
<p>ABC<p>
-----------------
Output would be
-----------------
ABC<p>

-----------------

удалит только первый тег para

para, но не для второго тега para

, и весь текст между ними будет одинаковым

Я хочу упомянуть здесь, что я ищу

<p>ABC<p> 

не для

<p>ABC</p>

Это для конкретного текстового файла, имеющего нерегулярные

теги

Пример:

у меня большой xhtml-файл, как ...

<p>scet</p>
<p>sunny </p>
<p>             <!--this tag is to be removed -->
<p>              <!--this tag is to be removed -->
<p>mark</p>
<p>Thomas </p>

это полный тег XHTML file.having body head и т. Д. Единственная проблема здесь дополнительные теги я ожидаю такой выходной

<p>scet</p>
<p>sunny </p>

<p>mark</p>
<p>Thomas </p>

Ответы [ 3 ]

0 голосов
/ 08 сентября 2010

Вдохновленный этим прекрасным постом :

(?# line 01) <(?<open>.+?)> 
(?# line 02) (?> 
(?# line 03) <(?<open>.+?)> (?<DEPTH>) 
(?# line 04) | 
(?# line 05) </\k<open>> (?<-DEPTH>) 
(?# line 06) | 
(?# line 07) .? 
(?# line 08) )* 
(?# line 09) (?(DEPTH)(?!)) 
(?# line 10) </\k<open>> 

Это позволит извлечь только правильно совпадающие теги, но не закрытые самостоятельно;он также выполнит базовую проверку вложенности, но не намного:
input:

<code><p>scet</p>
<p>sunny </p>
incorrect
<p>
<p>
<pre>mark

Thomas asd

это должно соответствовать

не должно совпадать

вывод:

<p>scet</p>
<p>sunny </p>
<a>asd</a>
<p><a>this should match</a></p>

Каждая строка вывода соответствует одному совпадению.Однако теги, содержащие атрибуты, конечно же, не будут включены.Регулярное выражение, которое будет правильно обрабатывать больше случаев, было бы по-настоящему ужасно, даже с хорошим форматированием, показанным в блоге, на который я ссылался:)

В этих случаях (особенно если я понимаю, вам нужно )valid XHTML output) Я всегда рекомендовал бы запускать ввод через специализированный синтаксический анализатор, предпочтительно тот, который красиво выводит ошибки синтаксического анализа, и обрабатывал эти ошибки вместо того, чтобы взламывать регулярные выражения.Не знаю хороших (X) HTML-парсеров, хотя, не нужно было делать что-то подобное в течение очень долгого времени.

0 голосов
/ 21 сентября 2010

Это будет работать, возьмите HTML-документ в виде строки xhtml

 public static class XHTMLCleanerUpperThingy
    {
        private const string p = "<p>";
        private const string closingp = "</p>";

    public static string CleanUpXHTML(string xhtml)
    {
        StringBuilder builder = new StringBuilder(xhtml);
        for (int idx = 0; idx < xhtml.Length; idx++)
        {
            int current;
            if ((current = xhtml.IndexOf(p, idx)) != -1)
            {
                int idxofnext = xhtml.IndexOf(p, current + p.Length);
                int idxofclose = xhtml.IndexOf(closingp, current);

                // if there is a next <p> tag
                if (idxofnext > 0)
                {
                    // if the next closing tag is farther than the next <p> tag
                    if (idxofnext < idxofclose)
                    {
                        for (int j = 0; j < p.Length; j++)
                        {
                            builder[current + j] = ' ';
                        }
                    }
                }
                // if there is not a final closing tag
                else if (idxofclose < 0)
                {
                    for (int j = 0; j < p.Length; j++)
                    {
                        builder[current + j] = ' ';
                    }
                }
            }
        }

        return builder.ToString();
    }
}
0 голосов
/ 08 сентября 2010

Одна возможность: использовать синтаксический анализатор xhtml, исправляющий искаженный xhtml.Одна из таких библиотек - libxml2.Затем используйте библиотеку, чтобы найти и удалить пустые теги p.

...