2010-01-25 102 views
2

我寫了一個簡單的函數來檢查我發送的字符串「應該」是否有效。preg_match如何正確工作?

// this works without problems 
function validate_email ($value) { 
    return preg_match ("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value); 

} 

// this doesn't work 
function validate_string ($value) { 
    return preg_match ("([^<>?=/\]+)", $value); 

} 

第一功能效果很好,如果我發送電子郵件至validate_email我已經習慣了保持有效還給我10如果不是。


validate_string應該對每種類型的字符串都做同樣的事情,但不要使用? = < >/\。如果我檢查函數,它在任何情況下都會返回1,爲什麼?

validate_string ("tonino"); // return 1 ok 
validate_string ("ton\ino\"); // return 1 why? 
validate_string ("ton?asd=3"); // return 1 why? 

^焦內([^<>?=/]+)應該是指不能(或不?)

+1

該電子郵件檢查不起作用,沒有問題。對於初學者,它無法匹配[email protected]。 – Quentin 2010-01-25 14:39:09

+0

是的,它驗證擴展名不超過4個字符的地址,是否是.museum有效的擴展名? – vitto 2010-01-25 15:39:17

+0

它與「.mobi」或「.xn - 0zwm56d」這樣的名稱一起: http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains – 2010-01-25 16:01:05

回答

1

你的代碼有幾個錯誤。除此之外,"ton\ino\"不是有效的字符串,[^<>?=/\]+不是有效的正則表達式,您可能有一些邏輯誤解。如果有至少一個字符不是<>?=/\

你的正則表達式[^<>?=/\\]+(這裏糾正)將匹配。所以如果至少有一個這樣的字符,preg_match返回1ton\ino"ton?asd=3都包含至少一個這樣的字符(匹配在這兩種情況下ton)。

針對此修復方法是使用字符串(^$)的開始和結束的斷言,只允許合法字符整個字符串:

^[^<>?=/\\]+$ 

或者用一個正面人物類[<>?=/\\]+相匹配的非法字符和否定的preg_match返回的表達式:

function validate_string ($value) { 
    return !preg_match("([<>?=/\\\\]+)", $value); 
} 

但它會很肯定更好地使用白名單,而不是黑名單。

+1

呃...你的也不是一個有效的正則表達式。 – 2010-01-25 15:55:28

+0

@ÁlvaroG. Vicario:修正了它。 – Gumbo 2010-01-25 15:57:11

+0

我總是遇到正則表達式的問題,謝謝你的幫助,我使用這個表達式,因爲它是爲像last.fm日本藝術家這樣的url,所以我應該插入幾乎所有的字符 – vitto 2010-01-25 15:59:38

4

你是不是匹配字符串的開頭(^)和結束($)後的字符。所以"ton?asd=3"匹配,因爲模式匹配t(和字符串的其餘部分是無關緊要的)。

+1

我相信模式匹配你的例子中的''ton' – SilentGhost 2010-01-25 14:42:28

+0

是的,它會匹配'ton'(因爲表達式是貪婪的)。雖然我沒有太好地表達,但是t就是所需要的。 – Quentin 2010-01-25 15:13:55

+0

謝謝,我每次都嘗試記住正則表達式的規則,但我總是失敗! – vitto 2010-01-25 16:03:29

0

\是一個元字符,你需要逃避它。所以它會是

return preg_match ("([^<>?=/\\\\]+)", $value); 
+1

這個正則表達式是無效的,甚至不會編譯 – 2010-01-25 15:54:03

+0

@Álvaro糟糕 - 忘記正確逃脫,同時建議正確地逃脫:反諷,你的名字是...... – Amarghosh 2010-01-25 16:34:29

0
function validate_string ($value) { 
    return !preg_match('#[<>?=/\\\\]#', $value); 
} 
+0

有點解釋會很好。 – 2015-01-12 16:16:16

+1

這可能是也可能不是有用的代碼,但它不回答問題。只是顯示一小段代碼不會幫助提問者或其他讀者理解問題及其解決方案。 – AdrianHHH 2015-01-12 16:20:53