8
votes

Comment vérifier si une chaîne peut être utilisée comme nom de variable dans PHP?

en PHP On peut utiliser des variables variables ...

par exemple ... xxx

Cependant, une chaîne de nom de champ peut contenir des caractères non autorisés dans les noms de variables . PHP créera toujours le champ avec ce nom (un peu comme le tableau associatif), mais je ne pourrai pas y accéder avec $ objet -> ...... car il ne pourra pas analyser correctement.

Maintenant, y a-t-il une fonction qui peut vérifier si la chaîne peut être utilisée comme nom de variable PHP valide. Sinon, comment cela serait-il créé avec des expressions régulières? Quelles sont les règles pour les noms de variables dans PHP?


2 commentaires

Bien que vous puissiez certainement le faire, il est probablement une mauvaise conception de prendre cette approche avec des variables.


(liée) noms exotiques pour les méthodes, les constantes, les variables et les champs


7 Réponses :


4
votes

'[a-za-z_ \ x7f- \ xff] [A-za-z0-9_ \ x7f- \ xff] *' validera un nom de variable PHP.

Cette regex est directement de la documentation à: http: // www .php.net / manuel / fr / langue.variables.basics.php


0 commentaires

16
votes

de Le manuel :

Les noms de variables suivent les mêmes règles que les autres étiquettes de PHP. Un nom de variable valide commence par une lettre ou un trait de soulignement, suivi d'un nombre quelconque de lettres, de chiffres ou de soulignements. En tant qu'expression régulière, il serait exprimé ainsi: '[a-za-z_ \ x7f- \ xff] [a-za-z0-9_ \ x7f- \ xff] *'

Donc, si vous avez exécuté votre chaîne via le regex, vous devriez être capable de dire s'il est valide ou non.

Il convient de noter que la possibilité d'accéder à la propriété "invalide" Les noms utilisant une variable variable sont l'approche correcte de certains analyses XML.

Par exemple, à partir du SimplexML Docs:

Accessibilité des éléments dans un document XML contenant des caractères non autorisés dans la Convention de dénomination de PHP (par exemple, le trait d'union) peut être accompli en encapsulant le nom de l'élément dans les accestrices et l'apostrophe.

suivi de ce code exemple: xxx

donc ce n'est pas nécessairement mauvais avoir des propriétés qui ne peuvent être accessibles que de cette façon .

Cependant, si votre code crée et utilise l'objet - on se demandera pourquoi vous utiliseriez ce type de propriétés. Autoriser, bien sûr, une situation similaire à l'exemple SimplexML , dans laquelle un objet est créé pour représenter quelque chose en dehors de la portée de votre contrôle.


3 commentaires

Pourquoi echo preg_match ('/ [a-za-z_ \ x7f- \ xff] [a-za-z0-9_ \ x7f- \ xff] * /' "," .1master "); Imprime 1? Comment accepte-t-il le point?


@kornelijepetak parce que preg_match recherche une correspondance, ce n'est pas la validation de la chaîne entière. Utilisez / ^ [a-za-z_ \ x7f- \ xff] [a-za-z0-9_ \ x7f- \ xff] * $ / pour forcer la correspondance à être la chaîne entière.


Je ne comprends pas pourquoi \ x7f- \ xff est utilisé ici? Quelqu'un peut-il l'expliquer?



0
votes

Je pense que Regex est la voie à suivre, et autant que je me souvienne de rappeler les restrictions sont les suivantes:

  • alphanumérique
  • doit commencer par une lettre
  • peut contenir un soulignement

    de sorte que la regex serait "/ [a-za-z] + [0-9a-za-z _] * /" - sur le dessus de ma tête afin que votre militaire puisse varier.


0 commentaires

1
votes

Cependant, la chaîne de nom de terrain $ peut contenir certains caractères non autorisés dans les noms de variables. PHP créera toujours le champ avec ce nom (un peu comme le tableau associatif), mais je ne pourrai pas y accéder avec $ objet -> ...... car il ne pourra pas analyser correctement. P>

Vous serez toujours en mesure d'accéder au champ via l'objet $ -> {"Nom de terrain"} code> Syntaxe. P>

Autant que je sache, la seule restriction est que Vous ne pouvez pas accéder aux propriétés avec \ x00 code> dans le nom et vous ne pouvez pas définir les variables commençant par \ x00 code>. p>

exemple: P> >

$a = new stdclass;
$a->{"\x00dd"} = 8; //invalid
$a->{"dd\x00dd"} = 8; //valid, but...
echo $a->{"dd\x00dd"}; //can't read (no property "dd")


1 commentaires

@WEB C'est probablement parce que les caractères nuls sont utilisés pour mettre en œuvre des propriétés privées et ils n'ont été introduits que dans PHP 5.



1
votes

Mais je ne pourrai pas y accéder avec $ objet -> ...... parce que ça serait pas analyser correctement

mais look: xxx

certainement non recommandé mais il peut être fait


0 commentaires

9
votes

Comme il était déjà répondu, mais pas avec une ligne de code complète: xxx


0 commentaires

0
votes

Validation avec regex si vous souhaitez autoriser $ code> ou & $ code> (variable passe par référence) à valider dans la chaîne, vous pouvez utiliser cette regex:

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


0 commentaires