Регулярные выражения: RegEx для определения допустимых имен свойств класса PHP? - PullRequest
1 голос
/ 26 марта 2010

Я использую магические __set и __get методы PHP для доступа к приватному массиву в классе. Использование класса может включать в себя «установку» новых свойств, а также использование существующих. Я хочу убедиться, что имена созданных или запрошенных свойств (т.е. $myObj->FakeProperty) действительны в соответствии со следующими правилами:

  1. Имена свойств должны начинаться с буквы или подчеркивания [A-z _]
  2. Если оно начинается с подчеркивания, за ним должна следовать буква
  3. Пока соблюдаются первые два правила, имя может содержать любое из [A-z0-9 _]

Мой нынешний RegEx не работает; с моими тестовыми значениями _12 всегда проваливается в трещины.

Тестовые поля:

albert12
12Albert
_12
_Albert12
_12Albert
_____a_1

RegEx:

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

Ответы [ 4 ]

4 голосов
/ 26 марта 2010

в соответствии с документами , следующее будет соответствовать любому действительному идентификатору php

/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/
4 голосов
/ 26 марта 2010

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

2 голосов
/ 26 марта 2010

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

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

var_dump(new Test);
1 голос
/ 26 марта 2010

Может быть, я что-то упускаю, но __get и __set срабатывают только тогда, когда вы уже пытались получить доступ к синтаксически допустимому имени свойства, которое недоступно через открытый API объекта. Если вы хотите убедиться, что элемент, к которому вы пытаетесь получить доступ, существует в приватном массиве, используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...