在 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);
我正在尝试从包含某些字符串(例如 [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);