2014-01-15 153 views
1

滑稽的正則表達式,我的最後一個問題是關於同一主題的,但很可惜:麻煩與PHP

我運行下面的代碼:

preg_match('/<th.*>.*Organizer.*title=\".*\">(.*)<\/a>/mi', $file_string, $organizer); 

在下面的內容:

<tr> 
<th valign="top"> Organizer: 
</th> 
<td style="width:55%;"> <a href="/starcraft2/TaKe" title="TaKe">TaKe</a> 
</td></tr> 

我不能爲了我的生活找出爲什麼它不起作用。我可以將它與主辦單位匹配:使用正則表達式'/.*Organizer',但似乎只要有新行,就會停止工作,儘管有/ m選項。有任何想法嗎?

+0

它的多行輸出?因爲你的正則表達式我不相信它應該遍歷線,所以默認情況下它在一行上工作 – nrathaus

+0

我的不好,php的'm'行爲是多行的 – nrathaus

+0

你的問題是'。*'不匹配換行符 – nrathaus

回答

1

好了,所以這個問題是新線不斷,但是這正則表達式將得到a元素的文本:

<th.*|\n>.*|\nOrganizer.*|\n*title=".*">(.*)<\/a> 

注意爲表達*|\n

這是一個Regex 101來證明它。


由於Niet說,你可以只使用s修改。正則表達式然後是:

<th.*>.*Organizer.*title=".*">(.*)<\/a> 

但你會發送一個額外的修飾符 - s。這是一個Regex 101來證明它。

+0

爲什麼不使用DOTALL修飾符's'? –

+0

@NiettheDarkAbsol,奇妙的想法 - 非常感謝!你每天學習新的東西! –

+0

[我也會用](http://stackoverflow.com/a/21138662/)'s'修飾符代替。這容易得多。 –

0

默認情況下,點字符與換行符不匹配。如果您還希望.匹配換行符,則需要s修飾符。

PHP manual

如果設定了此修正,在模式中的圓點元字符的所有字符,包括換行符匹配。沒有它,換行符被排除在外。

但是,使用正則表達式解析HTML通常是一個壞主意。我建議你改用DOM Parser