在 php 中通过正则表达式查找字符串中的值

Finding values in a string via regex in php

我正在尝试从包含某些字符串(例如 [name])的文本区域中获取信息,并使用正则表达式模式查找包含在方括号中的每个项目(目前尝试使用 preg_match、preg_split、preg_quote、preg_match_all)。看来问题出在我为它提供的正则表达式模式中。

我当前的正则表达式:
$menuItems = preg_match_all('/[^[][([^[].*)]/U', $_SESSION['emailBody'], $menuItems);

我尝试了许多其他模式,例如
/(?[...]\w+): (?[...]\d+)/

非常感谢可以为此提供的任何帮助。

编辑:

示例输入:
[email] address [to] name [from] someone

$menuItems 变量的 var_dump 上显示的消息:
数组(1){ [0]=> 字符串(0)“”}

编辑 2:

感谢大家对此的帮助和支持,我很高兴地说这一切都已经完成,运行完美!

转义方括号并删除点:

$menuItems = preg_match_all('/[^[]\[([^[]*)\]/U', $_SESSION['emailBody'], $menuItems); 
//                         here __^    __^ ^

preg_match_all 不是 return 字符串。您必须为最后一个参数添加一个数组:

preg_match_all('/\[([^[\]]*)\]/U', $_SESSION['emailBody'], $matches); 

匹配项在数组 $matches

print_r($matches);

工作示例:

$str = '[email] address [to] name [from] someone';
preg_match_all('/\[([^[\]]*)\]/U', $str, $matches); 
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => [email]
            [1] => [to]
            [2] => [from]
        )

    [1] => Array
        (
            [0] => email
            [1] => to
            [2] => from
        )

)

从上面的评论流中,您可以将正则表达式简化如下:

preg_match_all('/\[(.*)\]/U', $_SESSION['emailBody'], $menuItems);

注意一点:

preg_match_all() 用匹配结果填充数组的第三个参数。然后,您的示例行使用 preg_match_all()(整数)的结果覆盖此数组。

然后您应该能够使用以下循环迭代结果:

foreach ($menuItems[1] as $menuItem) {
    // ...
}

这是一个简单的解决方案。此正则表达式将捕获括在括号中的所有项目以及括号。

如果您不想在结果中使用方括号,请将正则表达式更改为 $regex = "/(?:\[(\w+)\])/mi";

$subject = "[email] address [to] name [from] someone";
$regex = "/(\[\w+\])/mi";
$matches = array();
preg_match_all($regex, $subject, &$matches);
print_r($matches);