文字列をPHPの変数名として使用できるかどうかを確認する方法は?
-
09-10-2019 - |
質問
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の他のラベルと同じルールに従います。有効な変数名は、文字またはアンダースコアから始まり、その後に任意の数の文字、数字、またはアンダースコアが続きます。正規表現として、それは次のように表現されます。
'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
したがって、Regexを介して文字列を実行した場合、それが有効かどうかを判断できるはずです。
変数変数を使用して「無効な」オブジェクトプロパティ名にアクセスする機能は、一部のXML解析の正しいアプローチであることに注意する必要があります。
たとえば、から SimpleXML
ドキュメント:
PHPの命名規則(ハイフンなど)で許可されていない文字を含むXMLドキュメント内の要素へのアクセスは、ブレース内の要素名とアポストロフィ内の要素名をカプセル化することで達成できます。
このコードの例:
echo $xml->movie->{'great-lines'}->line;
必ずしもそうではありません 間違い この方法でのみアクセスできるプロパティを持つこと。
ただし、コードがオブジェクトを作成して使用する場合、なぜこの種のプロパティを使用するのか疑問に思うでしょう。もちろん、に似た状況を許可します SimpleXML
例では、コントロールの範囲外の何かを表すためにオブジェクトが作成されます。
他のヒント
すでに返信されていたので、完全なコード行ではありません。
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]*'
PHP変数名を検証します。
この正規表現は、次のドキュメントから直接からのものです。 http://www.php.net/manual/en/language.variables.basics.php
ただし、 `$ 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
確かに推奨されませんが、それ できる 終わり。
許可したい場合は、正規表現で検証します $
また &$
(参照によるパス変数)文字列で検証するには、このRegexを使用できます。
/^([\$]|(&\$))[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/
Regexが行く方法だと思います。私が覚えている限り、制限は次のとおりです。
- 英数字
- 手紙から始めなければなりません
- アンダースコアを含めることができます
したがって、正規表現は「/[a-za-z]+[0-9a-za-z _]*/」 - 頭の上から外れて、あなたの走行距離が異なる場合があります。