簡體   English   中英

preg_match的問題

[英]Problems with preg_match

我正在使用preg_match來驗證表單上的輸入。 具體來說,我正在嘗試驗證貨幣的輸入。 這是功能:

if (preg_match("/^\$(((\d{1,3},)+\d{3})|\d+)\.\d{2}$/i", $inString)) {
    return True;
} else {
    return False;
}

我可以讓它全部工作。 無論我喂它什么(包括有效字符串),我都會一直返回False。 我確定我做的事情顯然是錯的,但我看不出來。 你知道是怎么回事...

有人有什么建議嗎?

嘗試這樣的事情:

$inString = '1550.50';

if (preg_match("/\b\d{1,3}(?:,?\d{3})*(?:\.\d{2})?\b/", $inString)) {
    echo "True"; 
} else {
    echo "False";
}

說明:

\b      # word boundary assertion
\d{1,3} # 1-3 digits
(?:     # followed by this group...
 ,?     # an optional comma
 \d{3}  # exactly three digits
)*      # ...any number of times
(?:     # followed by this group...
 \.     # a literal dot
 \d{2}  # exactly two digits
)?      # ...zero or one times
\b      # word boundary assertion

preg_match函數已經返回True或False,具體取決於它是否匹配,因此不需要再次返回True或False。

這意味着您可以直接回顯True或False的值:

$inString = "$12.50";
$price_regex = '~^\$(((\d{1,3},)+\d{3})|\d+)\.\d{2}$~';
echo preg_match($price_regex, $inString);
// echoes 1

您也可以直接返回這些值:

return preg_match($price_regex, $inString);

您可以執行布爾測試:

if( preg_match($price_regex, $inString) ) { // take some action }
else { // take another action }

如果您想要的是根據是否匹配來回顯一些值,請執行以下操作:

echo (preg_match($price_regex, $inString)) ? "**It Matches!**" : "Nah... No match." ;

筆記:

  • 將分隔符更改為~ (更清晰)
  • 刪除了i標志(沒有字母,因此不需要區分大小寫)

這兩個答案這項工作之前給出的,但這里的原因,原來的preg_match模式沒有工作的解釋。

這是因為模式用雙引號括起來。 當PHP看到這個時,它將$ sign后面的任何內容視為變量名。 如果您需要在雙引號字符串中包含文字$符號,則美元必須以反斜杠開頭。

所以這兩種模式都有效:

'/^\\$(((\\d{1,3},)+\\d{3})|\\d+)\\.\\d{2}$/i' "/^\\\\$(((\\d{1,3},)+\\d{3})|\\d+)\\.\\d{2}\\$/i" '/^\\$(((\\d{1,3},)+\\d{3})|\\d+)\\.\\d{2}$/i' "/^\\\\$(((\\d{1,3},)+\\d{3})|\\d+)\\.\\d{2}\\$/i" '/^\\$(((\\d{1,3},)+\\d{3})|\\d+)\\.\\d{2}$/i' "/^\\\\$(((\\d{1,3},)+\\d{3})|\\d+)\\.\\d{2}\\$/i"

顯然,在這種情況下使用單引號更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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