Проверка имени класса / метода с регулярным выражением

В настоящее время я работаю над структурой MVC Style для компании, и по соображениям безопасности мне нужно убедиться, что контроллер / метод, переданный через строку запроса, является допустимым символом для RFC (который я не могу найти).

Мне нужно иметь возможность проверять / дезактивировать имена классов в соответствии с тем, что разрешено интерпретатором PHP

Например:

class SomEFunk__YClAssName extends Controller { } 

Мне нужно какое-то регулярное выражение, которое будет проверять SomEFunk__YClAssName и дезинфицировать его, если потребуется! Это также те же принципы, что и методы.

Необходимо принять во внимание несколько вещей, таких как

  • Нумерация в начале
  • Разрешены только символы подчеркивания
  • Определенные специальные символы PHP должны быть разрешены.

Любая информация об этом или возможных выражениях будет действительно полезна.

Вот некоторые из моих Router Code, поэтому вы можете увидеть, где мне нужно его реализовать:

 private function prepareQueryString() { if(strlen($this->query_string) == 0) { return; } //Remove [ending|starting|multiple] slashes $this->query_string = preg_replace('/^\/+|\/+$|\/(?=\/)/', '', $this->query_string); foreach(explode('/',$this->query_string) as $Key => $Value) { if($Key == 0) { $Controller = $this->AssignController($Value); } if($Key == 1) { $this->AssignMethod($Value); }else { $this->AssignParam($Value); } } //Build RouterVar stdClass } public function AssignController(String $Controller) { if(!empty($Controller)) { //Sanitize } } public function AssignMethod(String $Method) { if(!empty($Method)) { //Sanitize } } public function AssignParam(String $Param) { $this->params[] = $Param; } 

Вы увидите комментарий «Sanitize», где требуется проверка.

Я считаю, что регулярное выражение, которое вы ищете, это:

 <?php preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $input); ?> 

Согласно: http://php.net/manual/en/language.oop5.basic.php

Вам лучше использовать очень общее регулярное выражение, а затем проверить, что класс существует с простым вызовом class_exists() .

Это будет соответствовать любому действительному имени класса PHP, включая действительно странные, такие как ___ или _3 , оба из которых являются допустимыми именами классов:

 /^[a-z_]\w+$/i 

Я лично более ограничиваю, чем соглашения об именах PHP для классов. Я требую, чтобы мои контроллеры были заглавными и пост-исправлены с _controller так что странные классы неконтроллеров не вызываются через странные URL-адреса. Я бы использовал что-то вроде этого:

 class Products_controller extends Controller { } // elsewhere, after parsing the controller name from the URI: if (preg_match('/^[AZ]\w+_controller$/', $controller_name) && class_exists($controller_name)) { $controller = new $controller_name(); } 

Как в стороне, передача имени контроллера через строку запроса дает действительно уродливые и недружественные URL поисковых систем. Подумайте о создании имени и метода контроллера в URL-адресе:

 /products/index # controller=products, action=index /users/show/3 # controller=users, action=show, user id=3