Php Preg_match适合初学者

时间:2014-06-30 10:41:16

标签: php

我需要preg_match()的帮助。我有关于preg_match()的这项任务我需要完成。

我有这样的字符串"[test|test2|test3] is [test4|test5|test6] "我需要在[]内找到字符串,

这是我的尝试:

$str = "[test|test2|test3] is [test4|test5|test6] "; 
preg_match_all("/\[(.*)\]/", $str, $output);
print_r($output);

当我阅读文档时,我认为是正确的。

我的预期输出

test|test2|test3

test4|test5|test6

但在我的print_r();

我的实际输出:

test|test2|test3] is [test4|test5|test6

我是否有可能以这样的方式爆炸弦?

array(
   [0] => test|test2|test3,
   [1] => is,
   [2] => test4|test5|test6
)

我正在研究一个解析输入并输出如下字符串的函数:

test is test4
test is test5
test is test6

test2 is test4
test2 is test5
test2 is test6

test3 is test4
test3 is test5 
test3 is test6

但它也应该适用于看起来像这样的输入

 the [test|test2|test3] is so [test4|test5|test6]  and [test7|test8|test9] 

the unicorn is so [test4|test5|test6]  and [test7|test8|test9] 

2 个答案:

答案 0 :(得分:1)

默认情况下,量词是贪婪的。您的.尽可能匹配。

两种解决方案:

  1. 请改用(.*?)。这使得量词不会贪婪,并且会尽可能少地匹配。

  2. 使用([^\]]*)。这是首选,因为它明确定义了您的终端。

答案 1 :(得分:0)

您需要了解greedy and non-greedy匹配。您的匹配当前正在进行贪婪匹配,这意味着代码将匹配的最大字符数。

您可以在正则表达式中使用?运算符来声明您的匹配是非贪婪的。

preg_match_all("/\[(.*?)\]/", $str, $output);
#                     ^ non-greedy

有很多方法可以做到这一点 - 另一种方法是捕获所有不是]的字符:

preg_match_all("/\[([^\]*)\]/", $str, $output);

由于视觉复杂性的增加,我不是第二个的粉丝,但从其他答案可以看出,意见各不相同!