0

I'm trying to get the result below, but I can not, could someone give me an idea?

My Cod.:

$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 />";
    }
}

Expected result:

1: 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

2: ZAMM tincidunt cursus eu amet nunc ZAMM c ac nunc, et pid pellentesque amet,                   ZSSS m urna scelerisque in vut

3: ZAMM c ac nunc, et pid pellentesque amet,                   ZSSS m urna scelerisque in vut
4

3 回答 3

1
/ZAMM(.(?!ZAMM))*/

取所有未跟随ZAMM的字符。这称为负前瞻

于 2013-04-19T21:38:19.903 回答
1

你需要对这种事情使用前瞻。您需要的模式如下所示:

/ZAMM.*?(?=(ZAMM|$))/

这就是正则表达式开始变得复杂的地方。这个想法是您正在匹配一个字符串,但还要在字符串中向前查找以找到匹配的终点。您可以在此处找到有关此和其他高级正则表达式语法的更多信息:http ://www.regular-expressions.info/refadv.html

您还需要.*通过添加问号将现有模式变为“非贪婪”模式,否则它将在第一次匹配时继续到字符串的末尾(就像它已经在做的那样)。

希望有帮助。

于 2013-04-19T21:44:17.637 回答
0

.*是“贪婪的”,所以第一个匹配将消耗整个字符串的其余部分。相反,尝试.*?使其不贪婪。

于 2013-04-19T21:31:43.547 回答