在PHP中清理合法变量名称的字符串

时间:2012-09-09 14:30:10

标签: php string class variables sanitization

我有类似下面的代码,它声明了一个类,它的名称基于检索到的字符串。但问题是字符串可能包含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
}

3 个答案:

答案 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);
}

还需要考虑的问题:

  • 您想启用空白支持吗?在这种情况下,您需要在$ pattern变量中添加一个空格。
  • 文件名是否使用英语以外的语言?然后,您需要进行一些特定于语言环境的操作才能使$ pattern更新。

HTH