сопоставить несколько шаблонов в строке в PHP

У меня было несколько шаблонов ("=","‹",">","!=",">=","‹="), которые мне нужно проверить на наличие случайных строк, предоставленных пользователем. Мне также нужно найти позицию возникновения этого шаблона. Пользовательский строковый формат будет таким

"Name =" 
"Age >"
"date<="

По сути, мне нужно разделить имя поля и эти шаблоны, чтобы он выводился как.

"Name" and "=" 
"Age" and ">" 
"date" and "<=" 

Обратите внимание, что между полем «Имя» и «возраст» может быть любое количество пробелов.

Прямо сейчас я делаю это, сначала удаляя пробел, а затем сопоставляя каждый из шаблонов один за другим, используя strpos, и если совпадает, то я разделяю его, используя позицию из strpos, чтобы получить 2 substr.

Есть ли лучший способ сделать это?


person Ram    schedule 05.12.2012    source источник


Ответы (2)


Если ваше имя поля не может содержать специальные символы, которые вы используете для шаблонов, это не очень сложно. Что-то вроде этого должно помочь (возможно, потребуется небольшое тестирование перед использованием):

preg_match("#([^=<>!]+)\s*([=<>!]+)#", trim($string), $matches);
echo $matches[1] . ' and ' . $matches[2];

Это, однако, извлечет только имя поля и шаблон, это не скажет вам «положение» шаблона.

P.S. Чтобы получить позицию, если она вам так нужна, вы можете использовать $position = strpos($string, $matches[2]);

И если вы хотите убедиться, что пользователь может указать только разрешенные шаблоны, вы можете указать их вручную, и выражение будет выглядеть примерно так: #([^=<>!]+)\s*(=|<|>|(!=)|(>=)|(<=))#

person Ranty    schedule 05.12.2012
comment
да, он работает правильно, я знал, что это можно сделать с помощью preg, но я действительно плохо пишу регулярное выражение. Спасибо за вашу помощь. - person Ram; 05.12.2012

preg_split("/\s+/",  $string);

если вы знаете, что у вас будут только эти два поля. Более адаптированное регулярное выражение с preg_match, если нет.

person Amadan    schedule 05.12.2012