PHP 中的正则表达式 Pipe bar 问题
我有一行文本,看起来像“...X...Y...”,其中 X 和 Y 都是“Ok”、“Empty”或“Open”。使用 PHP,我尝试使用 preg_match() 来找出每一个是什么。
$regex = '/(Ok|Open|Empty)/';
preg_match($regex, $match, $matches);
print_r($matches);
但是,在 X 为“Empty”且 Y 为“Ok”的情况下,以下行给出两个匹配项:“Empty”和“Empty”。
这个正则表达式有什么问题?
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
preg_match()
仅执行一次匹配,即找到的第一个匹配。在你的情况下,第一个是“空”。preg_match()
返回的数组包含与第一个槽$matches[0]
中的整个正则表达式匹配的文本。对于每个组(括号),
$matches
的下一个槽将包含捕获的内容。在您的情况下,您有一组包含“空”。结果将是
$matches[0] == "Empty"
和$matches[1] == "Empty"
要捕获与您的正则表达式匹配的所有内容,您必须使用
preg_match_all()
方法。第一个槽将包含所有匹配的字符串,第二个槽将包含每个字符串的第一个捕获组。
ideone 上的代码
资源:
preg_match()
do only one match, the first it find. In your case the first is "Empty".The array returned by
preg_match()
contains the text matching to your whole regex in the first slot$matches[0]
.For each group (the parenthesis) the next slots of
$matches
will contain the captured content. In your case you have one group, containing "Empty".The result will be
$matches[0] == "Empty"
and$matches[1] == "Empty"
To capture everything that matches your regex you have to use the
preg_match_all()
method.The first slot will contain all the matching strings, and the second will contain the first captured group for each of these strings.
The code on ideone
Resources :
使用
preg_match_all
use
preg_match_all
您需要使用
preg_match_all()
来获得多个结果。典型的匹配数组是这样构建的:您只匹配第一个“Ok”、“Open”或“空”,但由于您使用了匹配组,因此它出现了两次。
You need to use
preg_match_all()
for multiple results. The typical matches-array is constructed like this:You are only matching the first Ok, Open or empty, but since you use a match group, it appears twice.