Соответствие регулярному выражению <title></title>, включая перевод строки в любом месте - PullRequest
0 голосов
/ 12 июля 2011

Я пытаюсь написать регулярное выражение для извлечения из URL, но проблема в том, что "." не соответствует переводу строки, как мы уже знаем. Как написать регулярное выражение для сопоставления и извлечения pageTitle (. *?), Но символ новой строки может находиться где-то между

Я использую Grails.

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

Хотя вы не можете использовать регулярные выражения для анализа общего HTML, в этом случае вам, вероятно, это сойдет с рук. В Groovy вы можете использовать оператор (?s), чтобы точки соответствовали символам новой строки. Возможно, вам также следует использовать оператор (?i), чтобы сделать ваше регулярное выражение без учета регистра. Вы можете объединить их как (?is).

Например

def titleTagWithNoLineBreaks = "<title>This is a title</title>"
def titleTagWithLineBreaks = """<title>This is
a title</title>"""

// Note the (?is) at the beginning of the regex
// The 'i' makes the regex case-insensitive
// The 's' make the dot match newline characters
def pattern = ~/(?is)<title>(.*?)<\/title>/

def matcherWithNoLineBreaks = titleTagWithNoLineBreaks =~ pattern
def matcherWithLineBreaks = titleTagWithLineBreaks =~ pattern

assert matcherWithNoLineBreaks.size() == 1
assert matcherWithLineBreaks.size() == 1

assert matcherWithLineBreaks[0][1].replaceAll(/\n/,' ') == "This is a title"

Надеюсь, это поможет.

1 голос
/ 12 июля 2011

Предполагается, что это для PHP:

preg_match( "#<title>(.*?)</title>#s", $source, $match );
$title = $match[1];

Независимо от того, какое программное обеспечение вы используете, добавление расширения s изменит . (любой символ) так, чтобы оно включало символы новой строки.

0 голосов
/ 13 июля 2011

Если все, что вам нужно, это проанализировать, возможно, искаженные документы HTML, вы можете попробовать использовать синтаксический анализатор TagSoup . Тогда вы можете просто использовать выражения GPath, и вам не придется беспокоиться о странностях, таких как "" в комментарии в заголовке и т. Д.

import org.ccil.cowan.tagsoup.Parser

final parser  = new Parser()
final slurper = new XmlSlurper(parser)
final html    = slurper.parse('http://www.example.com/')

println html.depthFirst().find { it.name() == 'title' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...