我有类似下面的代码,它声明了一个类,它的名称基于检索到的字符串。但问题是字符串可能包含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
}
答案 0 :(得分:2)
您可以使用
检查字符串是否是有效的标识符(类名,变量名或函数名)if (preg_match("/^[_a-zA-Z][_a-zA-Z0-9]*$/", $received_string)) {
// valid name
} else {
// invalid name
}
答案 1 :(得分:1)
PHP作者提供了正则表达式,请参阅manual entry on classes:
<?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]*)$
进行验证(区别在于,整数是允许的字符,类/函数名称可能不以一个开头)。
答案 2 :(得分:1)
首先确定您需要过滤器或验证器。验证器将返回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);
}
还需要考虑的问题:
HTH