2009-10-27 74 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}