簡體   English   中英

使用PHP確保字符串僅包含數字,字母和下划線?

[英]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是不正確的,因為返回值為01 ,而不是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.

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