正则表达式捕获记录PHP

时间:2013-04-19 14:58:37

标签: php regex arrays string

我需要捕获字符串的ZAMM记录。 当你有空间时,我无法捕获属于它的数据。

我的字符串:

$string ='ZAMM Et a est hac pid pid sit amet, lacus nisi
ZPPP scelerisque sagittis montes, porttitor ut arcu
ZAMM tincidunt cursus eu amet nunc
ZAMM c ac nunc, et pid pellentesque amet, 
ZSSS m urna scelerisque in vut';

预期回报:

ZAMM Et a est hac pid pid sit amet, lacus nisi
ZAMM tincidunt cursus eu amet nunc
ZAMM c ac nunc, et pid pellentesque amet,

我正在使用:

$arrayst    = explode(" ", $string);

foreach($arrayst as $stringit) { 

    if(preg_match("/ZAMM.*/", $stringit, $matches)) {
       echo $stringit;
       echo "<br />";
    }

}

// Return:
ZAMM
arcu ZAMM
nunc ZAMM

我使用错误的正则表达式?

编辑:最后一个问题。 如果我的字符串是这样的:

$string ='ZAMM Et a est hac pid pid sit amet, lacus nisi ZPPP scelerisque sagittis montes, porttitor ut arcu            ZAMM tincidunt cursus eu amet nunc           ZAMM c ac nunc, et pid pellentesque amet, ZSSS m urna scelerisque in vut';

3 个答案:

答案 0 :(得分:5)

为此,您需要在多行模式下使用正则表达式,因此您可以使用m modifier,并查看整行数据。

首先,我们在行的开头查找行的开头和所需的数据:

^ZAMM

...然后我们会查找不是新行的任何数据:

.+

我们可以在这里使用.因为它与新行不匹配,除非您还指定了s修饰符,我们不会这样做。接下来我们断言一行:

$

把所有这些放在一起,你得到:

/^ZAMM.+$/m

在PHP中使用它:

$string ='ZAMM Et a est hac pid pid sit amet, lacus nisi
ZPPP scelerisque sagittis montes, porttitor ut arcu
ZAMM tincidunt cursus eu amet nunc
ZAMM c ac nunc, et pid pellentesque amet, 
ZSSS m urna scelerisque in vut';

preg_match_all('/^ZAMM.+$/m', $string, $matches);

print_r($matches[0]);

See it working

答案 1 :(得分:2)

问题不在于你的正则表达式,而在于你的explode(" ", $string)。执行此操作时,您将字符串拆分为单词数组。你不希望这样!您希望正则表达式对整个字符串进行操作,而不是对每个单词进行操作。

实际上,你想要的是在你的字符串中每行操作的正则表达式。

$string ='ZAMM Et a est hac pid pid sit amet, lacus nisi
ZPPP scelerisque sagittis montes, porttitor ut arcu
ZAMM tincidunt cursus eu amet nunc
ZAMM c ac nunc, et pid pellentesque amet, 
ZSSS m urna scelerisque in vut';

if(preg_match_all("/ZAMM.*/", $string, $matches)) {
    foreach($matches[0] as $match){
        echo $match;
        echo "<br />";
    }
}

DEMO:http://ideone.com/BQIfkY

答案 2 :(得分:1)

我改变了这个 - &gt; $arrayst = explode(" ", $string);到此 - &gt; $arrayst = explode("\n", $string);因为在你的字符串中还有\n(换行符),这只是我的看法,但你应该放在每行\n之后(换行符)