提问人:Kornelije Petak 提问时间:10/21/2010 更新时间:3/25/2017 访问量:6811
如何检查字符串是否可以在PHP中用作变量名?
How to check if a string can be used as a variable name in PHP?
问:
在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中变量名的规则是什么?
答:
'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
将验证 PHP 变量名称。
此正则表达式直接来自以下文档:http://www.php.net/manual/en/language.variables.basics.php
从手册:
变量名称遵循与 PHP 中其他标签相同的规则。有效的变量名称以字母或下划线开头,后跟任意数量的字母、数字或下划线。作为正则表达式,它将被表达为:
'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
因此,如果你通过正则表达式运行你的字符串,你应该能够判断它是否有效。
应该注意的是,使用变量访问“无效”对象属性名称的能力是某些 XML 解析的正确方法。
例如,从文档中:SimpleXML
访问XML文档中包含PHP命名约定不允许的字符(例如连字符)的元素可以通过将元素名称封装在大括号和撇号中来实现。
后跟以下代码示例:
echo $xml->movie->{'great-lines'}->line;
因此,拥有只能以这种方式访问的属性并不一定是错误的。
但是,如果您的代码既创建又使用对象,那么人们会想知道为什么要使用这些属性。当然,允许出现类似于示例的情况,即创建一个对象来表示控制范围之外的内容。SimpleXML
评论
preg_match
/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/
我认为正则表达式是要走的路,据我所知,限制是:
- 字母
- 必须以字母开头
- 可以包含下划线
所以正则表达式将是“/[a-zA-Z]+[0-9a-zA-Z_]*/” - 从我的头顶上掉下来,所以你的里程可能会有所不同。
但是,'$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")
评论
但我无法访问它 带 $object->......因为它会 解析不正确
但是看:
class A {}
$varName = '!asd asd';
$a = new A();
$a->$varName = '1';
echo "{$a->{'!asd asd'}}"; // 1
当然不推荐,但可以做到。
因为它已经回复了,但没有完整的代码行:
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
}
使用正则表达式进行验证 如果你想允许或(通过引用传递变量)在字符串中进行验证,你可以使用这个正则表达式:$
&$
/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/
评论