Как проверить, может ли строка использоваться в качестве имени переменной в PHP? - PullRequest
7 голосов
/ 20 октября 2010

В 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 ]

15 голосов
/ 20 октября 2010

С инструкция :

Имена переменных следуют тем же правилам, что и другие метки в PHP. Допустимое имя переменной начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркивания. Как регулярное выражение, оно будет выражаться так: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

Так что, если вы пропустили вашу строку через RegEx, вы сможете определить, является ли она действительной или нет.

Следует отметить, что возможность доступа к «недопустимым» именам свойств объекта с использованием переменной-переменной является правильным подходом для некоторого анализа XML.

Например, из SimpleXML документов:

Доступ к элементам в документе XML, которые содержат символы, не разрешенные в соответствии с соглашением об именах в PHP (например, дефис), может быть выполнен путем инкапсуляции имени элемента в фигурные скобки и апостроф.

За этим примером кода:

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

Так что не обязательно неправильно иметь свойства, к которым можно получить доступ только таким способом.

Однако, если ваш код создает и использует объект - можно задаться вопросом, почему вы используете такие свойства. Разумеется, допускается ситуация, аналогичная примеру SimpleXML, где создается объект, представляющий что-то, выходящее за рамки вашего элемента управления.

9 голосов
/ 29 февраля 2012

Как уже было сказано, но не с полной строкой кода:

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
}
4 голосов
/ 20 октября 2010

'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' проверит имя переменной PHP.

Это регулярное выражение непосредственно из документации по адресу: http://www.php.net/manual/en/language.variables.basics.php

1 голос
/ 20 октября 2010

но я не смогу получить к нему доступ с $ object -> ...... потому что неправильно разобрать

но посмотрите:

class A {}

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

Конечно, не рекомендуется, но можно сделать.

1 голос
/ 20 октября 2010

Однако строка `$ fieldName может содержать некоторые символы, которые не допускаются в именах переменных.PHP по-прежнему будет создавать поле с этим именем (во многом как ассоциативный массив), но я не смогу получить к нему доступ с помощью $ object -> ......, потому что он не будет анализироваться правильно.

Вы по-прежнему сможете получать доступ к полю с помощью синтаксиса * 1005. *

Насколько я знаю, единственным ограничением является то, что вы не можете получить доступ к свойствам с \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 голосов
/ 25 марта 2017

Проверка с помощью RegEx, если вы хотите разрешить $ или &$ (передавать переменную по ссылке) в строке, вы можете использовать это регулярное выражение:

/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/
0 голосов
/ 20 октября 2010

Я думаю, что регулярное выражение - это путь, и насколько я помню, ограничения:

  • буквенно-цифровой
  • должен начинаться с буквы
  • может содержать подчеркивание

так что регулярное выражение будет "/ [a-zA-Z] + [0-9a-zA-Z _] * /" - от макушки моей головы, поэтому ваш возраст может отличаться.

...