如何检查字符串是否可以在PHP中用作变量名?

时间:2010-10-20 16:30:54

标签: php variables object names variable-variables

在PHP中,可以使用变量...

例如......

class obj { }
$fieldName = "Surname";
$object = new obj();
$object->Name = "John";
$object->$fieldName = "Doe";
echo "{$object->Name} {$object->Surname}"; // This echoes "John Doe".

但是,$ fieldName字符串可能包含变量名中不允许的某些字符。 PHP仍然会创建具有该名称的字段(很像关联数组),但我无法使用$ object-> ......来访问它,因为它无法正确解析。

现在,是否有任何函数可以检查字符串是否可以用作有效的PHP变量名。如果没有,如何使用正则表达式创建它? PHP中的变量名称有哪些规则?

7 个答案:

答案 0 :(得分:15)

来自the manual

  

变量名遵循与PHP中其他标签相同的规则。有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线。作为正则表达式,它将表达为:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

所以如果你通过RegEx运行你的字符串,你应该能够判断它是否有效。

应该注意的是,使用变量变量访问“无效”Object属性名称的能力是某些XML解析的正确方法。

例如,来自SimpleXML文档:

  

通过将元素名称封装在大括号和撇号中,可以访问包含PHP命名约定下不允许的字符的XML文档中的元素(例如连字符)。

接下来是这个代码示例:

echo $xml->movie->{'great-lines'}->line;

因此,只有错误才能拥有只能以这种方式访问​​的属性。

但是,如果您的代码都创建并使用了对象 - 那么您会想知道为什么要使用这些属性。当然,允许类似于SimpleXML示例的情况,其中创建对象以表示控件范围之外的内容。

答案 1 :(得分:9)

因为它已被回复,但没有完整的代码行:

if ( preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/','evaluation string') )
{
    // the string is valid
}
else
{
    // the string is not valid
}

答案 2 :(得分:4)

'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'将验证PHP变量名称。

此正则表达式直接来自以下文档:http://www.php.net/manual/en/language.variables.basics.php

答案 3 :(得分:1)

  

但是,`$ fieldName字符串可能包含变量名中不允许的某些字符。 PHP仍然会创建具有该名称的字段(很像关联数组),但我无法使用$ object-> ......来访问它,因为它无法正确解析。

您仍然可以通过$object->{"fieldname"}语法访问该字段。

据我所知,唯一的限制是您无法访问名称中包含\x00的属性,也无法定义以\x00开头的变量。

示例:

$a = new stdclass;
$a->{"\x00dd"} = 8; //invalid
$a->{"dd\x00dd"} = 8; //valid, but...
echo $a->{"dd\x00dd"}; //can't read (no property "dd")

答案 4 :(得分:1)

  

但我无法访问它   与$ object-> ......因为它会   没有正确解析

但是看:

class A {}

$varName = '!asd asd';
$a = new A();
$a->$varName = '1';
echo "{$a->{'!asd asd'}}"; // 1

当然不推荐,但可以完成。

答案 5 :(得分:0)

如果要在字符串中验证$&$(通过引用传递变量),请使用RegEx进行验证,您可以使用此正则表达式:

/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/

答案 6 :(得分:-1)

我认为正则表达式是要走的路,据我所知,限制是:

  • 字母数字
  • 必须以字母开头
  • 可以包含下划线

因此正则表达式将是“/ [a-zA-Z] + [0-9a-zA-Z _] * /” - 从我的头顶开始,所以你的milage可能会有所不同。