我需要用preg_match_all获取某些字符串之间的文本。我试过使用交替,但没有得到正确的信息。我需要的是获取工作日字符串之间的随机文本。从星期五开始,它应该一直到文本的末尾。
我的数据如下:
Monday 1.1.
randomtext
randomtext
Tuesday 2.1.
randomtext
randomtext
Wednesday 3.1
randomtext
randomtext
Thusday 4.1.
randomtext
randomtext
randomtext
Friday 5.1
randomtext
randomtext
我现在拥有的是这个,但它只在周一之后捕捉到东西,那时它应该停在周二,然后再做一次:
/(Monday|Tuesday|Wednesday|Thursday|Friday)(['s'S]+)/
有什么想法吗?
您可以使用preg_split()
。
$day_pattern = '/([a-z]+?day ['d'.]+'n)/i';
$bits = preg_split(
$day_pattern,
$str,
null,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE
);
if ($bits)
foreach($bits as $bit)
echo preg_match($day_pattern, $bit)
?
'<h3>'.$bit.'</h3>'
:
'<p>'.$bit.'</p>';
输出
<h3>Monday 1.1.</h3>
<p>randomtext
randomtext</p>
<h3>Tuesday 2.1.</h3>
<p>randomtext
randomtext</p>
<h3>Wednesday 3.1</h3>
<p>randomtext
randomtext</p>
<h3>Thusday 4.1.</h3>
<p>randomtext
randomtext
randomtext</p>
<h3>Friday 5.1</h3>
<p>randomtext
randomtext</p>
试试这个方法,使用m
修饰符和^
+$
来匹配文本的每一行。
$datas = <<<data
Monday 1.1.
randomtext
randomtext
Tuesday 2.1.
randomtext
randomtext
Wednesday 3.1
randomtext
randomtext
Thusday 4.1.
randomtext
randomtext
randomtext
Friday 5.1
randomtext
randomtext
data;
preg_match_all('#^(?!Monday|Tuesday|Wednesday|Thusday|Friday)'w+$#im',$datas,$matches);
print_r($matches);
在您的示例中,实际上是"随机文本…."不在特定字符串之间,因为它在末尾缺少字符串(周五之后)
Monday 1.1.
randomtext1
randomtext2
Tuesday 2.1.
randomtext3
randomtext4
Wednesday 3.1
randomtext5
randomtext6
Thursday 4.1.
randomtext7
randomtext8
randomtext9
Friday 5.1
randomtext10
randomtext11
Monday
如果文本将像上面一样,即它将始终在工作日字符串之间,您可以使用以下模式。
(?<=Monday|Tuesday|Wednesday|Thursday|Friday)(['s'S]+?)(?=Monday|Tuesday|Wednesday|Thursday|Friday)