2009-10-27 76 views
0

我想選擇所有的文本在兩者之間遵循特定的模式後:選擇文本模式

示例文字:

"by thatonekid (Posted Mon Jan 12, 2009 7:17 pm) 
fell onto the trail right below one of the most traveled walls at the point! yikes! 

" 

每個文本,我的工作將開始:「通過用戶名(發佈日期)<br /> theTextIWant「

我想過關於paren的爆炸,但很明顯,如果還有另一個paren,可能會破壞文本。

其次,一些文本以「<br /><br />」結尾。如果之後沒有文字,我需要刪除尾部的<br />

我道歉,如果這看起來像我要求別人做我的功課 - 老實說,我不知道從哪裏開始在這裏

回答

3

(對不起GTG,越到後來,如果沒有解決,幫助你)如果你只想要的用戶名/日期後的文字,你可以簡單地在第一< BR />,假設你格式化之前刪除一切是一致的。

$text = preg_replace("/^.*?<br(\s\/)?>/si", "", $string); 

,包括之前和第一< BR>或< BR />,不區分大小寫,用一個空字符串,讓你只用文字這將取代一切。 。*?開始時是非貪婪的比賽,意味着它會盡可能少地捕捉。換句話說,它不會搶過第一次休息。

可以再用遵循此:

$text = preg_replace("/^.*?<br(?:\s\/)?>(.*?)(<br(\s\/)?>)+$/si", "$1", $string); 

這應該刪除所有結尾的空白和< BR>/< BR />標記。

你也可以做這一切與一個單一的preg_replace:

$text = preg_replace("/.*?<br(?:\s\/)?>(.*)(?:<br(?:\s\/)?>\s*)+$/si", "$1", $string); 

我做了所有的()捕獲的(:)非捕獲,除了包含文本的一個?

(我不經常使用PHP,所以我假設perl兼容的正則表達式就是它所說的)。

+0

謝謝傑夫! 第一個替換返回一個空字符串。有任何想法嗎? 第三個返回以下錯誤: 消息:preg_replace():編譯失敗:在(?或(? - 在偏移量8之後無法識別的字符) – jmccartie 2009-10-27 18:45:47

+0

如何在第一個BR之後添加捕獲,然後簡單地返回捕獲?想法如何工作? – jmccartie 2009-10-27 18:49:50

+0

@jmccartie:好的,我解決了前兩個問題。我沒有使用's'修飾符來告訴它匹配整個字符串,包括多行。此外,我添加了^至於第三個,正確的非捕獲語法是(?:)不是(?),所以我解決了這個問題,但由於某種原因,它仍然不適合我。 – 2009-10-27 20:52:31

0

舉例來說,你可以嘗試放入系統的正則表達式,用的preg_match我猜。請參閱聯機文檔。

username : [_a-zA-Z09]+ 
date: [0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}