preg_match_更改字符串之间的所有文本


preg_match_all text between alteration strings

我需要用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)