2011-07-11 5 views
0

URLから抽出する正規表現を作成しようとしていますが、問題は "。"です。すでに知っている改行と一致しません。どのように正規表現を書いてpageTitle(。*?)にマッチして抽出するのですか?改行はどこにでもあります正規表現と一致するどこでも改行を含む<title></title>

私はgrailsを使用しています。

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

かかわらず、あなたはそれが改行を含むようs拡張子が.(任意の文字)を変更します追加し、使用しているソフトウェアの:それはPHPのためだと仮定すると、

+4

あなたはHTMLをRegexで解析しようとしていますか?希望[あなたは](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)または*

はそれを保持することができませんが遅すぎる*。 –

+0

Grailsとこれとは何が関係していますか?おそらくあなたはGroovyを意味するのでしょうか? – Gregg

答えて

1

+0

パターンの最後に「s」を追加する必要がありますか? Groovyではうまくいきません。 – toy

+0

セパレータを使って正規表現を保持し、 's'を正規表現の最後に置きます。 –

+2

@Dark Slipstream、HTMLを解析するために正規表現を使用するよう奨励することで、なぜ貧しい人々を忘却に押しつけるのですか? –

4

一般的な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" 

お役に立てば幸いです。

0

可能性のある形式のHTML文書を解析する必要がある場合は、TagSoupパーサーを使用して試すことができます。次に、GPath式を使うだけで、 "</title >"のような奇妙なことをタイトルなどのコメントで心配する必要はありません。

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' } 
関連する問題