我试图从包含某些字符串(例如[name])的textarea中获取信息,并使用正则表达式模式找到包含在方括号中的每个项目(目前尝试使用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上显示的消息:
array(1){[0] => string(0)“”}
编辑2:
感谢大家对此的帮助和支持,我很高兴地说它完全正常运行!
答案 0 :(得分:0)
转过方括号并删除圆点:
$menuItems = preg_match_all('/[^[]\[([^[]*)\]/U', $_SESSION['emailBody'], $menuItems);
// here __^ __^ ^
preg_match_all不会返回字符串。您必须为最后一个参数添加一个数组:
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
)
)
答案 1 :(得分:0)
从上面的评论流中,您可以按如下方式简化正则表达式:
preg_match_all('/\[(.*)\]/U', $_SESSION['emailBody'], $menuItems);
有一点需要注意:
preg_match_all()
使用匹配结果在第3个参数中填充数组。然后,您的示例行将使用preg_match_all()
(整数)的结果覆盖此数组。
然后,您应该能够使用以下循环迭代结果:
foreach ($menuItems[1] as $menuItem) {
// ...
}
答案 2 :(得分:0)
这是一个简单的解决方案。这个正则表达式将捕获包含在括号中的所有项目以及括号。
如果您不希望结果更改正则表达式中的括号为$regex = "/(?:\\[(\\w+)\\])/mi";
$subject = "[email] address [to] name [from] someone";
$regex = "/(\\[\\w+\\])/mi";
$matches = array();
preg_match_all($regex, $subject, &$matches);
print_r($matches);