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


Sanitize Strings for Legal Variable Names in PHP

我有如下代码,它声明了一个类,其名称基于检索到的字符串。但问题是字符串可能包含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]*)$进行验证(不同的是,虽然整数是允许的字符,但类/函数名可能不会以一开头)。