Düzenli İfadeler: geçerli PHP sınıf özellik isimlerini belirlemek için Regex?

4 Cevap php

PHP'nin büyüsünü kullanıyorum __set ve __get yöntemler bir sınıf içinde özel bir dizi erişmek için. Sınıfının kullanımı yeni özelliklerini "ayarı" gibi varolanları kullanarak içerebilir. Ben özellik adları oluşturulan veya (yani $myObj->FakeProperty) aşağıdaki kurallara göre geçerli Talep emin olmak istiyorum:

  1. Özellik adları bir harfle ile başlaması veya [A-z_] altını gerekir
  2. Bir çizgi ile başlar, eğer bir harf tarafından takip edilmelidir
  3. Bu yüzden uzun ilk iki kural karşılandığı gibi, isim [A-z0-9_] herhangi içerebilir

Benim geçerli RegEx hile yapıyor değil; benim test değerleri, _12 her zaman çatlaklardan düşer.

Test Fields:

albert12
12Albert
_12
_Albert12
_12Albert
_____a_1

RegEx:

^(?=_*[A-z]+)[A-z0-9_]+$

4 Cevap

docs göre, aşağıdaki herhangi bir geçerli php tanımlayıcı maç olur

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

/^[a-z_][a-z0-9_]+$/i

Muhtemelen daha sonra diğer şeyler kıracak rağmen tamlık 'aşkına, sen adına hemen her şey ile özellikleri oluşturabilirsiniz farkında olmalıdır. Aşağıdaki working örneği ele alalım:

class Test {
    function __construct() {
        $this->{" `~!@#$%^&*()-_=+[]{},./?;:'\""} = "Don't try this in production code.";
    }
}

var_dump(new Test);

Belki de ben bir şey eksik, ama zaten nesnenin ortak API üzerinden kullanılamaz sözdizimsel olarak geçerli propertyName erişmeye çalıştığımızda __ get ve __ set sadece tetiklenir. Kullanmak, emin erişmeye çalıştığınız eleman özel dizide var olmak istiyorsanız array_key_exists:

class Foo {
    protected $data = array(
    'bar' => 'baz'
    );
    public function __get($name)
    {
        if(array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        throw new BadMethodCallException('Invalid property');
    }
}

$obj = new Foo;
$obj->123; // Syntax Error => __get won't be called
$obj->foo; // valid syntax, but not in array => BadMethodCall Exception
$obj->bar; // returns baz