PHP 中的正则表达式 Pipe bar 问题

发布于 2024-09-18 08:31:30 字数 311 浏览 10 评论 0 原文

我有一行文本,看起来像“...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”。

这个正则表达式有什么问题?

谢谢!

I have a line of text that looks like "...X...Y...", where X and Y are both either Ok, Empty, or Open. Using PHP, I'm trying to use preg_match() to figure out what each one is.

$regex = '/(Ok|Open|Empty)/';
preg_match($regex, $match, $matches);
print_r($matches);

However, in the case that X is "Empty", and Y is "Ok", the following line gives me two matches: "Empty", and "Empty".

What's wrong with this regex?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

忘年祭陌 2024-09-25 08:31:30

preg_match() 仅执行一次匹配,即找到的第一个匹配。在你的情况下,第一个是“空”。

preg_match() 返回的数组包含与第一个槽 $matches[0] 中的整个正则表达式匹配的文本。
对于每个组(括号),$matches 的下一个槽将包含捕获的内容。在您的情况下,您有一组包含“空”。

结果将是 $matches[0] == "Empty"$matches[1] == "Empty"


要捕获与您的正则表达式匹配的所有内容,您必须使用preg_match_all() 方法。

<?php

$match = "test Open test Empty test";

$regex = '/(Ok|Open|Empty)/';
preg_match_all($regex, $match, $matches);
print_r($matches);

?>

第一个槽将包含所有匹配的字符串,第二个槽将包含每个字符串的第一个捕获组。

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.

<?php

$match = "test Open test Empty test";

$regex = '/(Ok|Open|Empty)/';
preg_match_all($regex, $match, $matches);
print_r($matches);

?>

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 :

隔岸观火 2024-09-25 08:31:30

您需要使用 preg_match_all() 来获得多个结果。典型的匹配数组是这样构建的:

array(
    'Empty', // whole match
    'Empty'  // match group 1
)

您只匹配第一个“Ok”、“Open”或“空”,但由于您使用了匹配组,因此它出现了两次。

You need to use preg_match_all() for multiple results. The typical matches-array is constructed like this:

array(
    'Empty', // whole match
    'Empty'  // match group 1
)

You are only matching the first Ok, Open or empty, but since you use a match group, it appears twice.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文