簡體   English   中英

regex_match 的表單驗證規則

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM