все, но все между [и] - PullRequest
2 голосов
/ 06 января 2010

Я пытаюсь сопоставить все, но все между [и].

все, что между [и] есть

\[.+\]

все, но все между [и] есть

[^(\[.+\])]+

Текст для поиска

valid[REGEX_EMAIL|REGEX_PASSWORD|REGEX_TEST]

Соответствует "действительным" и "REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST".

Предполагается, что он соответствует «действительному», но не «REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST».

Как решить?

Я хочу, чтобы мой класс проверки php был похож на класс CodeIgniter ...

Ответы [ 8 ]

5 голосов
/ 06 января 2010

[^(\[.+\])]+ не означает, что вы думаете, что это означает.

В буквальном смысле это означает "соответствовать любому символу, кроме любой один из них () [. +] Один или несколькоtimes. "

[] - набор символов, совпадающий с одним из символов в этом наборе (или не соответствующий им, если он начинается с ^)

2 голосов
/ 06 января 2010

Я полагаю, вы найдете свой ответ в том, что называется негативным взглядом. Это позволяет вам включать шаблоны в ваш поиск, фактически не включая их в ваше соответствие.

/^.*(?!\[.+\])$/

(?! ...) - отрицательная заглядывающая часть.

1 голос
/ 07 января 2010

Я проверил исходный код класса проверки CI сейчас.

Они позволяют устанавливать правила как

array('field' => "valid|length[5]|foo|callback_bar")

Я не видел ни одноговложенные квадратные скобки или трубы внутри квадратных скобок.В Документах четко сказано, что у вас может быть только один параметр.Строка внутренне установлена ​​на $_rules.При проверке строка сначала будет exploded в массиве, поэтому приведенное выше будет иметь значение $rules.

'field' => array('valid', 'length[5]', 'foo', 'callback_bar')

Затем они будут проходить через массив, проверяя, является ли $ruleобратный вызов с substr().Затем они проверяют, есть ли в $rule квадратные скобки с шаблоном "/(.*?)\[(.*?)\]/", и если это так, снимите его с $rule и сохраните внутреннюю часть скобок как $param.И наконец, они просто выполняют $rule как переменную функцию с обнаруженным параметром, например, $rule(POST[$field], 5);

Как вы можете видеть, они не разделяют все за один раз.Это не отвечает на ваш вопрос, но пролить некоторый свет на внутреннюю логику CI для запуска их Validator может помочь вам переосмыслить ваш подход.

Мнение : Я хотел бы добавить, что их подходэто ужасноЦепочки валидаторов являются основными кандидатами на Командный шаблон .Конечно, приятно указывать валидаторы маленькими и компактными строками, но вы платите это большим количеством уродливого жонглирования строк, когда дело доходит до запуска цепочки.Посмотрите, как Zend Framework делает это, или посмотрите на PHP собственные функции фильтра .

1 голос
/ 07 января 2010

Попробуйте это на основе данных, которые вы используете 'valid [REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST]'

^[^[]+   

Будет возвращено «действительный».

В зависимости от того, какой язык вы используете, вам может потребоваться экранировать [, поэтому напишите это так ^[^\[]+

Это регулярное выражение предполагает, что в тексте, предшествующем [REGEX_EMAIL | REGEX_PASSWORD | REGEX_TEST] *, никогда не будет "["]

Я проверил это, используя RegexWorkbench Эрика Ганнерсона для .NET

1 голос
/ 06 января 2010
$string = 'valid[REGEX_EMAIL|REGEX_PASSWORD|REGEX_TEST]';

preg_match('#(\S+)\[.+?\]#', $string, $match);

echo $match[1];
0 голосов
/ 07 января 2010

Вам не нужно быть мастером регулярных выражений, когда есть Regex Tester . Просто введите некоторые тестовые данные и поиграйтесь с регулярным выражением, пока не получите желаемый результат. Справка также поможет вам быстро справиться.

Ну, по крайней мере, так я с ними справляюсь.

0 голосов
/ 07 января 2010

Попробуйте положительное упреждающее утверждение (которое само не фиксируется)

^.*(?=\[.+\])
0 голосов
/ 07 января 2010

Это три разных типа текста, если я правильно понимаю:

  1. С начала до первого [
  2. Между а] и [
  3. от последнего] до конца

Учитывая это, для каждого есть регулярное выражение:

  1. ^([^\x5B]*)[
  2. ]([^\x5B\x5D]*)[
  3. ]([^\x5D]*)$

(x5B и x5D - шестнадцатеричные escape-символы для левой и правой скобок.) Обратите внимание, что совпадение всего выражения будет включать скобки, обозначающие границы; подвыражение 1 дает совпадение, исключая скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...