我需要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]
答案 0 :(得分:1)
默认情况下,量词是贪婪的。您的.
尽可能匹配。
两种解决方案:
请改用(.*?)
。这使得量词不会贪婪,并且会尽可能少地匹配。
使用([^\]]*)
。这是首选,因为它明确定义了您的终端。
答案 1 :(得分:0)
您需要了解greedy and non-greedy匹配。您的匹配当前正在进行贪婪匹配,这意味着代码将匹配的最大字符数。
您可以在正则表达式中使用?
运算符来声明您的匹配是非贪婪的。
preg_match_all("/\[(.*?)\]/", $str, $output);
# ^ non-greedy
有很多方法可以做到这一点 - 另一种方法是捕获所有不是]
的字符:
preg_match_all("/\[([^\]*)\]/", $str, $output);
由于视觉复杂性的增加,我不是第二个的粉丝,但从其他答案可以看出,意见各不相同!