在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中的变量名称有哪些规则?
答案 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可能会有所不同。