![](/img/trans.png)
[英]regex_match in CodeIgniter form_validation generates: Message: preg_match(): No ending delimiter '/' found
[英]Form validation rules for regex_match
我試圖弄清楚我在這個驗證規則上做錯了什么,因為它說的是這個錯誤。
驗證規則:
$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[a-z0-9]');
錯誤:
嚴重性:警告
消息:preg_match() [function.preg-match]:分隔符不能是字母數字或反斜杠
首先,您需要修復您的模式。 你現在的模式是a-z0-9
它需要有一個分隔符包圍它,比如/a-z0-9/
(如果你在 Codeigniter 中使用反斜杠分隔符有問題,你有很多其他的選擇:請參閱PCRE 分隔符的手冊頁)
現在你有一個模式,它在字面上匹配一個帶有a-z0-9
的字符串。 請注意,如果您嘗試將其作為字符類進行匹配,則需要再次將其括在方括號中以使其如此,因此/[a-z0-9]/
現在我將假設您實際上想要檢查整個字符串是否為(小寫)字母數字,而不僅僅是它有一個與之匹配的字符。 在這種情況下,您需要一個前錨點、要匹配的字符類、一個重復修飾符(我假設您不想匹配一個空字符串並將其設為一個或多個),然后是一個錨點來指定匹配必須延伸到最后:
/^[a-z0-9]+$/
您甚至可以通過用大括號代替加號並提供最小值、最大值(保留最大值以允許其長度超過最小值)來設置最小長度...例如/^[a-z0-9]{3,}$
所以,你的第三個參數最終會看起來像:
'trim|required|xss_clean|regex_match[/^[a-z0-9]+$/]'
除了這實際上在 codeigniter 中顯然不起作用(截至 2011 年 3 月,無論如何都是這種情況),由於它如何處理驗證規則中的括號,因此您需要使用回調(請參閱此處)。
您可以在控制器(或其他適當的范圍內)中放置如下所示的函數:
public function _usernameRegex($userName) {
if (preg_match('/^[a-z0-9]+$/', $userName ) )
{
return TRUE;
}
else
{
return FALSE;
}
}
然后你設置規則來調用你的函數:
set_rules('username', 'Username', 'trim|required|xss_clean|callback__usernameRegex');
注意:如果您在控制器中創建回調函數,則該函數使用前導下划線命名以防止 url 訪問。 通過創建一個擴展CI_Form_validation
類的類,有一種替代方法可以做到這一點,但這似乎是一個更復雜的解決方案。 如果您使用前導下划線命名函數,請記住,您必須將其包含在規則中,這會導致callback__usernameRegex
總共有兩個下划線:一個用於callback_
的前綴,第二個用於函數名稱_usernameRegex
。 這可能非常簡單,不需要向您指出,但對我來說,這似乎很容易被遺漏。 有關擴展CI_Form_validation
的詳細說明,請參閱將自定義回調添加到 Codeigniter 表單驗證的鏈接答案。 請注意,如果您擴展表單驗證,則當您在set_rules
引用它時,您不需要使用callback_
附加您的函數。
您還可以為新回調設置消息:
$this->form_validation->set_message('usernameRegex', 'The %s field must only contain lowercase letters and/or numbers');
另一種方法是修改 Codeigniter 自己在 form_validation 規則上使用的模式匹配。 Ellislab 論壇的鏈接描述了這個問題,然后是在線程中進一步解決它的潛在方法。 從查看 Codeigniter 代碼和指定的修復程序來看,他們提供的建議解決方案可能會破壞在規則中使用數組:使用遞歸匹配替換 Codeigniter 函數中的一個更好的正則表達式可以解決這兩個問題,但可能會遇到性能問題規則。
Codeigniter 對 form_validation 規則的模式匹配可以在它的 system/libraries/Form_validation.php 文件中找到,在 2.1.3 的第 115 行。
使用以下代碼在我結束時工作正常
$this->form_validation->set_rules('username', 'Username','trim|required|callback_username_check|regex_match[/^[a-z0-9]+$/]');
php 的 preg_match 想要你的正則表達式被一個非字母數字字符包圍(通常每個人都使用 /),將你的 setRules() 更改為:
$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|regex_match[/a-z0-9/]');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.