更新/注意事项:
(仔细读:)
我有一个包含可变数量的段(简化)的字符串:
$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
Run Code Online (Sandbox Code Playgroud)
我想现在匹配段并通过匹配数组返回它们:
$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
Run Code Online (Sandbox Code Playgroud)
这只会返回捕获组2 的最后一个匹配:DD
.
有没有办法,我可以检索所有的子模式捕获(的方式AA
,BB
,DD
)与一个正则表达式执行?不preg_match_all
适合这个吗?
无论是$subject
和$pattern
简化.自然地与这样的通用列表AA
,BB
..是更容易与其它功能(例如,以提取explode
),或与的的变化$pattern
.
但我特别询问如何使用preg_...
-family函数返回所有子组匹配.
对于现实生活中的情况,假设您有多个(嵌套)级别的子模式匹配变量.
这是用于描述一些背景的伪代码的示例.想象一下:
令牌的常规定义:
CHARS := [a-z]+
PUNCT := …
Run Code Online (Sandbox Code Playgroud) 我正在接管一些在 php中使用eval()函数的网页游戏代码。我知道这可能是一个严重的安全问题,因此在我决定是否取消该部分代码之前,我需要一些帮助来审查检查其参数的代码。目前我已经从游戏中删除了这部分代码,直到我确定它是安全的,但功能的损失并不理想。我宁愿对此进行安全证明,也不愿重新设计整个段以避免使用 eval(),假设这样的事情是可能的。据称可以防止恶意代码注入的相关代码片段如下。$value 是一个用户输入的字符串,我们知道它不包含“;”。
1 $value = eregi_replace("[ \t\r]","",$value);
2 $value = addslashes($value);
3 $value = ereg_replace("[A-z0-9_][\(]","-",$value);
4 $value = ereg_replace("[\$]","-",$value);
5 @eval("\$val = $value;");
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的理解:
1) 从 $value 中删除所有空格
2)转义数据库调用需要它的字符(我不清楚为什么需要它)
3) 查找字母数字字符后紧跟 \ 或 ( 并用 - 替换它们的组合。大概这是为了删除字符串中与函数调用类似的任何内容,尽管我不清楚为什么它还删除前面的字符,这就是为什么在第 2 行明确添加它们之后,它也会删除 \。
4) 用 - 替换 $ 的所有实例,以避免任何类似于对字符串中 php 变量的引用。
那么:这里有没有留下任何漏洞?我是否误解了上面的任何正则表达式?最后,有没有办法在不排除 ( 字符?要输入的字符串是理想的数学公式的情况下对此进行安全证明,并且允许 ( 将允许操作操作顺序,目前这是不可能的。
从外部来源我得到的字符串就像
array(1,2,3)
Run Code Online (Sandbox Code Playgroud)
但也有更大的阵列
array("a", "b", "c", array("1", "2", array("A", "B")), array("3", "4"), "d")
Run Code Online (Sandbox Code Playgroud)
我需要它们是php中的实际数组.我知道我可以使用eval,但由于它是不受信任的来源,我宁愿不这样做.我也无法控制外部资源.
我应该为此使用一些正则表达式(如果是这样,是什么)还是有其他方法?