2011-12-13 38 views
0

這可以使用只有一個正則表達式來完成嗎?正則表達式 - 獲取包含給定標記的最短文本

編輯:請不要抱怨我解析HTML :)同樣的情況可以用純文本被複制:

應該源字符串:

Lorem 1 ipsum. Lorem 2 ipsum TOKEN 
foo. Lorem 3 ipsum 

應該源字符串HTML版本:

<div id="entry-1">Lorem ipsum</div> 
<div id="entry-2">Lorem ipsum TOKEN</div> 
<div id="entry-3">Lorem ipsum</div> 

我想得到的:

,因爲那個「Lorem ipsum」包含了令牌。

我想它使用:/([0-9]+).*TOKEN/sm,但我得到1,因爲它開始尋找TOKEN找到第一個「數字」後,即1

使用兩個獨立的正則表達式/的preg_match很容易,但我想知道這種方法是否可以改進。

在此先感謝您的幫助:)

+2

*我想得到:2 *,嘗試'echo 2;':) – Robik

+1

正則表達式+ html = [託尼小馬](http://stackoverflow.com/a/1732454/118068)會來和剪輯 - 全部在你的臉上。 –

回答

2

嘗試非貪婪*

/entry-([0-9]+).*?TOKEN/sm 

不能在所有平臺上運行,但它可能在工作(是JavaScript的?)

+0

據我所知,可以測試非貪婪行爲將避免找到包含2個標記的更長的字符串,它會在找到第一個標記後停止。這是PHP btw。謝謝 –

0

我會使用一個正回顧後,以確保你匹配的道理,就像這樣:

<div id="entry-([0-9]+)">.*(?<=TOKEN)</div> 

你可以這樣使用它:

$result = preg_match('%<div id="entry-([0-9]+)">.*(?<=TOKEN)</div>%i', $subject, $matches); 

這將匹配第二個例子,但不是第一個或第三個例子。

+0

它只適用於包含令牌的文本是單行的,即使我添加ms修飾符:(請參閱此處:http://www.ideone。com/VyO6n –

0

你的正則表達式是正確的,但問題是與s修改器,這導致.也匹配換行符,這使得你的正則表達式匹配1。刪除s

你也不需要m修飾符,因爲你沒有在你的正則表達式中使用錨點。

See it

這個回答假設entry-[0-9]及令牌上輸入同一行。

+0

我需要s和m修飾符,因爲包含TOKEN的文本可能有幾行:(如下所示:http://www.ideone.com/KryNE感謝您的鏈接,非常有用。 –

相關問題