2013-10-09 6 views
3

Я после курса Lynda.com для CakePHP 2.4.0 и на материале следующий код должен работать, но не с сообщением об ошибке: второйCakePHP непрохождения пользовательских правил проверки (регулярное выражение)

public $validate = array(
     'publication_name' => array(
      'words' => array(
       'rule' => array('custom', '/([\w.-]+)+[\w+.-]/'), 
       'message' => 'The publication name can only contain letters, numbers and spaces.', 
      ) 
     ), 
    ); 

" preg_match(): разделитель не должен быть буквенно-цифровым или обратным слэшем [CORE/Cake/Model/Validator/CakeValidationRule.php, строка 281] ".

В моем поиске регулярное выражение должно работать, поскольку оно использует не-буквенно-цифровой разделитель (/). Я совершенно недоумеваю, если не сказать больше.

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

Любое понимание того, почему это не проходит проверку? Я отличаюсь от кода моего кода от файлов упражнений автора и не уверен, что я (скорее всего) за просмотр ...

Благодарим вас за ваше время и понимание. Я действительно ценю это.

Исходный код модели, вида и контроллеров: http://tny.cz/0a995577

+0

И вы _are_ с помощью CakePHP 2.4.0? В этом случае правило, которое вы показываете там, обычно не будет обрабатываться на [Строка 281] (https://github.com/cakephp/cakephp/blob/2.4.0/lib/Cake/Model/Validator/CakeValidationRule.php # L281) 'CakeValidationRule.php', это были такие правила, как' 'words '=>' string value''. Регулярное выражение полностью отлично (синтаксис мудрый), он должен быть чем-то другим. Вам нужно будет показать еще некоторые из задействованного кода, действия контроллера, модели и т. Д. ... – ndm

+0

Теперь я собираюсь разделить файлы проектов с файлами автора. Я использую выпечку торта, которая показывает, что она использует приложение/Console/bake для 2.4.0, но у меня также есть установка 2.4.1, поэтому я, возможно, случайно испекла какой-то код, используя неправильную консоль для испечь ... Я скоро обновлю это. Спасибо за быстрый ответ. – DroBuddy

+0

Pastebin в настоящее время отключен из-за нагрузки, поэтому вот альтернатива, которая показывает полный источник для Model, App Controller и Publications Controller и Add View. http://tny.cz/0a995577 Я более чем рад предоставить любой другой исходный код, если необходимо, чтобы определить, почему правило не работает. Еще раз спасибо. – DroBuddy

ответ

2

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

Однако правило также не будет проверять, как и ожидалось (http://regex101.com/r/dA0pH9), так как регулярное выражение соответствует одно или несколько слов (в том числе и .-), разделенных одним пробелом, а затем с помощью одного слова полукокса (опять же в том числе и .-). Также он позволяет добавлять и добавлять произвольные символы, поскольку он не использует ^ и $.

Для того, чтобы он соответствовал вашим требованиям

одно слово, несколько слов, в том числе цифры и пробелы

попробовать что-то вроде этого:

/^(\w ?)+(?<!)$/ 

Это будет соответствовать одной или более слова (которые могут состоять только из чисел и могут иметь длину всего 1 символ), разделенных пробелом, не допускающим конечного пространства.

Хотя это будет также соответствовать что-то вроде 1 2 3 4 5 (http://regex101.com/r/kK3jG9/), которые не могут быть применимы, так что вы можете уточнить это, например, требуя, по крайней мере, 1 букву каждого слова, с минимальной длиной 3 символов:

/^((?=\d*[a-z])\w{3,} ?)+(?<!)$/i 

быстрый пробой:

(
    (?=\d*[a-z]) # the word must contain at least one letter 
    \w{3,} ?  # a word with at least 3 chars, optionally followed by a space 
)+    # one or more times 
(?<!)   # no trailing space allowed 
+0

Ты потрясающий! :) Еще раз спасибо за разъяснение. – DroBuddy

Смежные вопросы