在我的網站上,我有一個PHP註冊頁面。
有人可以通過使AshIey
模仿Ashley
。
我不希望發生這種情況。他們用大寫I
代替小寫字母L
。
字符串是$username
,我想檢查它是否包含一個大寫「我」。
如果是這樣,我會設置一個新的字符串並使用SQL查詢來查看它是否存在。
但是,如果用戶名有多個大寫字母呢?像DaryII
。
我在想做一個foreach語句,但不知道該怎麼做。
如果有人可以給我一些我需要做的演示,我會很感激。PHP檢查備用用戶名是否存在foreach?
0
A
回答
0
我知道了!!!
if (preg_match('/[^A-Za-z\d\s]|[^A-Z\s]I|[A-Z]I[a-z]/', $username)) {
die("That username is unavailable for registration.");
}
1
str_replace應該是你在找什麼。
2
就像KASIA Gogolek建議,你可能會感興趣的str_replace()
功能PHP提供。您可以使用它像:
$username = str_replace('I', 'l', $username);
或者,你可能想使用萊文斯坦距離函數來確定的$username
最匹配的字符串名稱的字典。即使您替換字符以減少資源使用情況,也只有在數據庫中沒有匹配的情況下才可以使用字典。 PHP有這樣一個功能,它被稱爲(出乎你的意料)levenshtein()
- more here。
如果你可以定義你的MySQL主機的存儲過程,你可以使用下面的程序(在MySQL 5.5.16測試):
CREATE FUNCTION `LEVENSHTEIN`(`s1` VARCHAR(255), `s2` VARCHAR(255))
RETURNS int(11)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
DECLARE s1_char CHAR;
DECLARE cv0, cv1 VARBINARY(256);
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = "0×00", j = 1, i = 1, c = 0;
IF s1 = s2 THEN
RETURN 0;
ELSEIF s1_len = 0 THEN
RETURN s2_len;
ELSEIF s2_len = 0 THEN
RETURN s1_len;
ELSE
WHILE j <= s2_len DO
SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
END WHILE;
WHILE i <= s1_len DO
SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
WHILE j <= s2_len DO
SET c = c + 1;
IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
IF c > c_temp THEN SET c = c_temp; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
IF c > c_temp THEN SET c = c_temp; END IF;
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
END WHILE;
SET cv1 = cv0, i = i + 1;
END WHILE;
END IF;
RETURN c;
END
和您的查詢可能是這樣一個:
SELECT t1.`key` FROM `dict` AS t1 WHERE levenshtein("patryk", t1.`key`) < 5
哪裏"patryk"
是你$username
變量。
編輯 我剛纔覈對您所提供的示例輸入(DaryII
和Daryll
)查詢並返回正確的行。
編輯2 您可能也有興趣的百分比。使用此功能,而不是那麼:
CREATE FUNCTION levenshtein_ratio(s1 VARCHAR(255), s2 VARCHAR(255))
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, max_len INT;
SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
IF s1_len > s2_len THEN
SET max_len = s1_len;
ELSE
SET max_len = s2_len;
END IF;
RETURN ROUND((1 - LEVENSHTEIN(s1, s2)/max_len) * 100);
END;
兩個功能是從http://www.artfulsoftware.com/infotree/queries.php#552
1
採取你可以通過避免建立一個規則,只允許小寫字母的用戶名,除了第一個字母的問題。這可以用像這樣的正則表達來實現:
if(preg_match('/^[A-Z]{0,1}[a-z]+$/', $username)){
echo 'Username is allowed';
}else{
echo 'Username is not allowed';
}
相關問題
- 1. Ajax檢查用戶名是否存在
- 2. 檢查用戶名是否存在PDO
- 3. 檢查用戶名是否存在
- 4. 檢查用戶名是否存在
- 5. 檢查用戶名是否存在| Parse.com
- 6. PHP檢查用戶是否存在PDO
- 7. php oop檢查用戶是否存在?
- 8. PHP檢查用戶是否存在PDO
- 9. PHP準備好的語句 - MySQL檢查用戶是否存在
- 10. 使用PHP和PDO檢查用戶名是否存在?
- 11. 檢查用戶名是否已經存在使用PHP
- 12. 使用PHP PDO檢查用戶名是否存在
- 13. PHP檢查用戶名是否設置
- 14. jQuery PHP:檢查用戶名是否已經存在
- 15. 檢查用戶名是否存在於兩個表PHP PDO?
- 16. php/jQuery檢查用戶名是否存在
- 17. Swift&Firebase |使用用戶名檢查用戶是否存在
- 18. PHP Sql檢查是否foreach
- 19. 流星檢查用戶集合中是否存在用戶名
- 20. 檢查名稱是否存在php
- 21. 檢查用戶名是否存在,並檢查密碼是否匹配
- 22. 檢查用戶是否在名單上
- 23. PHP檢查用戶是否在線
- 24. 檢查用戶名是否在PHP中可用
- 25. 檢查以查看用戶名是否存在
- 26. PDO準備SELECT語句檢查用戶是否存在
- 27. 如何使用PDO檢查用戶名是否已經存在?
- 28. 用MySQLi檢查用戶名是否已經存在
- 29. 檢查用戶名是否存在不起作用?
- 30. 檢查用戶名是否存在使用ajax
非常有幫助!這給了我一個好主意。我可以制定一條規則,如果它與字符串中的任何其他小寫字母相鄰(除了該字符串的第一個字符),則會阻止大寫字母I. – Dav