php正则表达式组

时间:2016-07-03 06:51:33

标签: php regex

我是php和regex的新手,我遇到了一个问题。

我的文字如下所示:" FIRST NAME:sdfksdfkjskdlfjlskdf更多数据:dsfkskldfjsdkfjsdkf EXTRA DATA:dsfksdfjlsdjfklsdf"

我想要三组,一组用于FIRST NAME,另一组用于更多数据,第三组用于EXTRA DATA。所以这是我的正则表达式:

FIRST NAME:(.*)MORE DATA:(.*)EXTRA DATA:(.*)

这就是我在java中的表现。

但是现在,我如何将其与php匹配,以便我可以回复如下内容:

echo "more data: " . matche(group(1));

例如。

谢谢你!

编辑:如果我重复自己怎么办?例如:FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf如何在while循环中抓取组,直到它结束匹配?

3 个答案:

答案 0 :(得分:1)

严格依据您的意见:

$re = "/(FIRST NAME\\s*:)\\s*(.*)(MORE DATA\\s*:\\s*)(.*)(EXTRA DATA\\s*:\\s*)(.*)/"; 
$str = "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf"; 

preg_match_all($re, $str, $matches);

然后检查$matches变量。这样您就可以拥有匹配的群组:FIRST NAME:first-name-valueMORE DATA: more-data-valueEXTRA DATA: extra-data-value

答案 1 :(得分:1)

让我们这样做:

preg_match('/FIRST NAME:\s*(.*?)\s*MORE DATA:\s*(.*?)\s*EXTRA DATA:\s*(.*)\s*/', $line, $matches);

您的匹配结果现在位于$matches,如下所示:

php > var_dump($matches);
array(4) {
  [0]=>
  string(93) "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsd"
  [1]=>
  string(20) "sdfksdfkjskdlfjlskdf"
  [2]=>
  string(19) "dsfkskldfjsdkfjsdkf"
  [3]=>
  string(17) "dsfksdfjlsdjfklsd"
}
php >

所以现在$matches[1]是第一组,依此类推。 [0]是整个匹配结果。

答案 2 :(得分:0)

你的正则表达式只能在任何正则表达式引擎中找到每个无换行符一个匹配项,因为最后一个.*匹配任何字符,0次或更多次。

如果您的输入总是重复这3个部分,请使用延迟点匹配并在最后一个之后添加正向前瞻以确保我们匹配字符串的结尾或FIRST NAME::< / p>

FIRST NAME:(.*?)MORE DATA:(.*?)EXTRA DATA:(.*?)(?=$|FIRST NAME:)
           ^^^^^          ^^^^^           ^^^^^ ^^^^^^^^^^^^^^^^

请参阅this regex demo

在这里,(.*?)尽可能少地匹配除换行之外的任何字符的0 +,并且(?=$|FIRST NAME:)零宽度断言要求.*?匹配到第一个:最后一个字符串或FIRST NAME:

PHP注意:在Java中,您使用Matcher#find来查找部分匹配并运行while循环。在PHP中,您只需use preg_match_all

$re = "/FIRST NAME:(.*?)MORE DATA:(.*?)EXTRA DATA:(.*?)(?=$|FIRST NAME:)/"; 
$str = "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]); // Print Group 1
print_r($matches[2]); // Print Group 2
print_r($matches[3]); // Print Group 3 

如果您是正则表达式优化粉丝,请展开延迟匹配组:

FIRST NAME:([^M]*(?:M(?!ORE DATA:)[^M]*)*)MORE DATA:([^E]*(?:E(?!XTRA DATA:)[^E]*)*)EXTRA DATA:([^F]*(?:F(?!IRST NAME:)[^F]*)*)

请参阅regex demo