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

How to check if a string can be used as a variable name in PHP?

提问人:Kornelije Petak 提问时间:10/21/2010 更新时间:3/25/2017 访问量:6811

问:

在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中变量名的规则是什么?

PHP 对象 名称 变量

评论

1赞 Fosco 10/21/2010
虽然你绝对可以做到,但采用这种带有变量的方法可能是一个糟糕的设计。
0赞 Gordon 10/21/2010
(相关)方法、常量、变量和字段的奇异名称

答:

4赞 Alan Geleynse 10/21/2010 #1

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

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

16赞 Tim Lytle 10/21/2010 #2

手册:

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

因此,如果你通过正则表达式运行你的字符串,你应该能够判断它是否有效。

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

例如,从文档中:SimpleXML

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

后跟以下代码示例:

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

因此,拥有只能以这种方式访问的属性并不一定是错误的

但是,如果您的代码既创建又使用对象,那么人们会想知道为什么要使用这些属性。当然,允许出现类似于示例的情况,即创建一个对象来表示控制范围之外的内容。SimpleXML

评论

0赞 Kornelije Petak 10/21/2010
为什么回声preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', “.1master”);打印 1?它如何接受点?
0赞 Tim Lytle 10/21/2010
@kornelijepetak因为正在寻找匹配项,所以它没有验证整个字符串。用于强制匹配项为整个字符串。preg_match/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/
0赞 Scott Chu 6/29/2016
我不明白为什么这里使用\x7f-\xff?谁能解释一下?
0赞 boodle 10/21/2010 #3

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

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

所以正则表达式将是“/[a-zA-Z]+[0-9a-zA-Z_]*/” - 从我的头顶上掉下来,所以你的里程可能会有所不同。

1赞 Artefacto 10/21/2010 #4

但是,'$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")

评论

0赞 Artefacto 10/21/2010
@web 这可能是因为空字符是用来实现私有属性的,而且它们只是在 PHP 5 中引入的。
1赞 webbiedave 10/21/2010 #5

但我无法访问它 带 $object->......因为它会 解析不正确

但是看:

class A {}

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

当然不推荐,但可以做到。

9赞 Robin Manoli 2/29/2012 #6

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

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
}
0赞 sMyles 3/25/2017 #7

使用正则表达式进行验证 如果你想允许或(通过引用传递变量)在字符串中进行验证,你可以使用这个正则表达式:$&$

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