3

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

3 回答 3

2

您可以使用以下方法检查字符串是否为有效标识符(类名、变量名或函数名)

if (preg_match("/^[_a-zA-Z][_a-zA-Z0-9]*$/", $received_string)) {
    // valid name
} else {
    // invalid name
}
于 2012-09-09T14:35:59.130 回答
1

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]*)$(不同之处在于,虽然整数是允许的字符,但类/函数名称可能不以一个开头)。

于 2012-09-09T14:34:37.037 回答
1

首先决定你需要什么过滤器或验证器。验证器将返回真/假。然后您可以引发异常,为用户产生错误或忽略该文件。另一种选择是使用过滤器,它可以有效地从输入字符串中删除字符。

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 保持最新。

高温高压

于 2012-09-09T14:45:11.817 回答