Регулярное выражение (C # аромат) для извлечения сначала <p></p> после заголовка тега - PullRequest
0 голосов
/ 07 мая 2009

Я почти закончил с системой трекбэка для моего сайта, но у меня есть одно последнее нигдеющее регулярное выражение, которое я просто не могу понять.

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

Первый абзац (помеченный <p></p> тегами), который следует за <h1></h1>, <h2></h2> или <h3></h3> в HTML-источнике страницы.

Например, я могу успешно извлечь тег <title></title> для HTML следующим образом:

Regex reTITLE = new Regex( @"(?<=<title.*>)([\s\S]*)(?=</title>)",
RegexOptions.IgnoreCase );

Match match = reTITLE.Match( strHTMLSource );
if (match.Success)
    {
        strReferringPageTitle = match.Value.Trim( );
    }

Мой вопрос - какое регулярное выражение я могу использовать для извлечения строки, описанной в первой части моего поста?

PS: я люблю StackOverflow и это сообщество - отличная работа, Joel & Co.!

Ответы [ 4 ]

2 голосов
/ 07 мая 2009
Match m = Regex.Match(strHTMLSource, "^.*?</h[123]>.*?<p>(.*?)</p>",
    RegexOptions.Compiled | RegexOptions.IgnoreCase);

string para = m.Success ? m.Groups[1].Value.Trim() : string.Empty;
1 голос
/ 07 мая 2009

Лично я бы использовал запросы XPath, чтобы сделать то, что вы пытаетесь достичь, гораздо проще, чем имо, чем возиться с регулярными выражениями.

0 голосов
/ 07 мая 2009

Есть много вариантов использования, для которых регулярное выражение не будет работать должным образом. Например:

<p>foo<p>bar</p>baz</p>

<p>This paragraph is valid <!-- <p>This one isn't</p> --> </p>

Регулярное выражение, которое захватывает текст между <p> и </p>, будет захватывать (соответственно):

foo<p>bar

This paragraph is valid <!-- <p>This one isn't

Если бы мне пришлось обрабатывать HTML, найденный в дикой природе, я бы использовал MSHTML для анализа HTML, а затем выполнял поиск в DOM, чтобы найти объекты.

Использование MSHTML далеко не так просто, как использование регулярного выражения, чтобы быть уверенным. Но MSHTML разработан, чтобы разобраться в самых небрежных веб-страницах. Я бы предпочел использовать все знания о беспорядочных реальных сценариях использования, для которых он предназначен, а не открывать их для себя.

См. Ответ на этот вопрос для небольшого количества примера кода.

0 голосов
/ 07 мая 2009

Это регулярное выражение найдет все первые абзацы после h1, h2 или h3. Если вам нужен только самый первый абзац на странице, просто оставьте первое совпадение.

(?<=</h[1-3]>\s*?<p>)([\s\S]*?)(?=</p>)

Возможно, вам придется настроить соответствия для тегов <p>, чтобы учесть атрибуты.

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