我有如下代码,它声明了一个类,其名称基于检索到的字符串。但问题是字符串可能包含PHP不接受的非法字符作为类名。那么,在将字符串用作类名之前,有没有一种好的方法可以对其进行净化呢?
$retrieved_string = 'some unformatted string; it may contain illegal characters to be passed as a class name.';
$strMyScript = basename(__FILE__, ".php");
$strMyScript = sanitize_variable($strMyScript);
$strClassName = sanitize_variable($retrieved_string);
eval('
class ' . $strMyScript . '_' . $strClassName . ' extends AnotherClass {
// some code here
}
');
funaction sanitize_variable($string) {
// sanitize the string
}
您可以使用检查字符串是否是有效的标识符(类名、变量名或函数名)
if (preg_match("/^[_a-zA-Z][_a-zA-Z0-9]*$/", $received_string)) {
// valid name
} else {
// invalid name
}
首先决定需要什么过滤器或验证器。验证器将返回true/false。然后,您可以引发异常,为用户生成错误,或者直接忽略该文件。另一种选择是使用一个过滤器,它可以有效地从输入字符串中删除字符。
public function sanitize($input)
{
$pattern = '/[^a-zA-Z0-9]/';
return preg_replace($pattern, '', (string) $input);
}
您可能还需要检查unicode。模式是:
public function sanitize($input)
{
if (!@preg_match('/'pL/u', 'a'))
{
$pattern = '/[^a-zA-Z0-9]/';
}
else
{
$pattern = '/[^'p{L}'p{N}]/u';
}
return preg_replace($pattern, '', (string) $input);
}
还需考虑的问题:
- 是否要启用空白支持?在这种情况下,您需要在$pattern变量中添加一个空格
- 文件名是英语以外的语言吗?然后,您将需要进行一些特定于区域设置的操作,以使$模式保持最新
HTH
PHP作者提供了一个正则表达式,请参阅类的手动条目:
<?php
if (preg_match('/^([a-zA-Z_'x7f-'xff][a-zA-Z0-9_'x7f-'xff]*)$/', $strClasssName)) {
// etc.
}
函数名或任何其他标签也是如此。
如果您希望清理字符串,那么可能需要删除所有不是[a-zA-Z0-9_'x7f-'xff]
的内容,然后根据^([a-zA-Z_'x7f-'xff][a-zA-Z0-9_'x7f-'xff]*)$
进行验证(不同的是,虽然整数是允许的字符,但类/函数名可能不会以一开头)。