[英]Making sure a string only contains numbers, letters, and underscores with PHP?
因此,我知道我將需要一個正則表達式,並使用preg_match()
。
preg_match()
的文檔說,如果偏移量大於字符串長度,則該函數將返回false或ish-ish。 我將文檔解釋為意味着,如果沒有匹配項,它將返回false。
我對正則表達式感到很糟糕,但是在此站點上閱讀了有關正則表達式的內容后,我試圖編寫一個滿足我需要的函數。 它不起作用。
我有以下片段:
if (preg_match('/^[a-zA-Z0-9_]+/', $requested_table_name) === false) {
echo "Invalid String";
} else {
echo "You're golden, Ponyboy";
}
如果我正確理解反斜杠在正則表達式的開頭和結尾,則克拉會告訴表達式在字符串的開頭開始。 字符類說匹配一個小寫字母,大寫字母,一個數字或下划線的字符,然后+
符號說該字符集與整個字符串匹配,而不僅僅是字符串的第一個字符。
我一定會弄錯,因為程序的輸出表明該字符串有效,而與輸入無關。
我的代碼有問題嗎是使用preg_match()
函數還是正則表達式的語法? 無論哪種情況,具體是什么問題,我該如何解決?
使用正則表達式,您走在正確的道路上。 您正在嘗試刪除所有不需要的字符,因此請查看preg_replace 。
一些評論提到了諸如\\w
的速記,它與單個字母,數字或下划線匹配。 還有\\W
(大寫),它匹配不是字母,數字或下划線的任何單個字符。
這將完成您想要的操作: $sanitized_input = preg_replace("/\\W/", "", $input);
或者,不使用速記,請注意使[class]
的字符取反的^
: $sanitized_input = preg_replace("/[^a-zA-Z0-9_]/", "", $input);
確保檢查preg_replace
返回的內容是否是您想要的(即,檢查失敗時是否為null
)。
您的正斜杠是定界符。 ^
表示start of string
。 [a-zA-Z0-9_]+
確實列出了您要允許的字符一次或多次。 但是,在那一次或多次之后,您將允許任何內容,例如A!
是有效的,因為它以A
開頭。 如果錨定該表達式,則將確保僅允許這些字符。
=== false
是不正確的,因為返回值為0
或1
,而不是false
。
演示(檢查不正確,尚未回答):
<?php
$string = 'asdf2341234_';
$return = preg_match('/^[a-zA-Z0-9_]+$/', $string);
if ($return === false){
echo 'is false';
} else {
echo 'not false';
}
var_dump($return);
所以你的正則表達式應該是...
if (!preg_match('/^\w+$/', $string)) {
echo "Invalid String" . $string . "\n";
} else {
echo "You're golden, Ponyboy" . $string . "\n";
}
要么...
if (!preg_match('/^[a-zA-Z0-9_]+$/', $string)) {
echo "Invalid String" . $string . "\n";
} else {
echo "You're golden, Ponyboy" . $string . "\n";
}
要么...
if (!preg_match('/^[a-z\d_]+$/i', $string)) {
echo "Invalid String" . $string . "\n";
} else {
echo "You're golden, Ponyboy" . $string . "\n";
}
您可以在regex101.com上測試regex。 它對您輸入的所有內容進行了說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.