2014-08-29 64 views
0

我有一點,檢查2個$ _ GET變量用的preg_match代碼。它還在數據庫中查找一個變量值。問題在於,當我調用變量時,URL編碼的電子郵件地址和@符號被替換爲%40不會變成可讀的文本。

所以,如果我調用$ _GET [「電子郵件」]中顯示的值是有人%40example.com而應該是[email protected]

我理解$ _ GET變量都會自動解碼,但它無法正常工作爲了我。這個問題伴隨着在這個域上安裝SSL。它可能與此有關嗎?

這裏是我的代碼:

if (isset($_GET['Email']) && preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', $_GET['Email'])) { 
    $Email = $_GET['Email']; 
} 
+1

的不是[驗證方式](http://stackoverflow.com/questions/12026842/how-to-validate-an-email-地址中的PHP/12026863#12026863)emailaddresses,因爲:https://emailtester.pieterhordijk.com/test-pattern/Nzc – PeeHaa 2014-08-29 14:01:47

+1

我從@PeeHaa評論表示贊同我會強烈建議使用'filter_var($ _ GET ['電子郵件'],FILTER_VALIDATE_EMAIL)' – 2014-08-29 14:03:56

+1

你正在處理輸入表單嗎?你是否在使用'multipart/form-data'內容類型?您需要'application/x-www-form-urlencoded'內容類型來向PHP發送內容需要解碼的信號。 – 2014-08-29 14:07:37

回答

-1

ü需要把urldecode()

$_GET variable doesnot get url decoded automatically. You have to do it manually. 

做這樣的事情

if (isset($_GET['Email']) && preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', urldecode($_GET['Email']))) 
{ 
    $Email = urldecode($_GET['Email']); 
} 

而且,這不是驗證電子郵件

的正確方法
+0

@PeeHaa ...不能給我urldecode方法的分?總是需要找藉口downvote別人 – Saswat 2014-08-29 14:19:23

+0

我真的不應該做出反應的人抱怨downvotes,但對於什麼是值得我刪除我的downvote你刪除的那一刻關於有道破聲明。所以... – PeeHaa 2014-08-29 14:49:32

-1

檢查您發送的內容類型標題。如果您要提交表單,那麼我應該在表單中使用application/x-www-form-urlencoded類型來告訴PHP數據是URL編碼的,並且應該自動解碼。也就是說,除非你(使用urldecode()取決於它是如何實際發送提交的文件上傳,在這種情況下multipart/form-data是適當的,並且可能需要的內容手動解碼,可以檢查$_SERVER['CONTENT_TYPE']來幫助你編程方式確定是否需要手動解碼。

其他一些指針:

  • 你或許應該考慮在這裏使用,而不是GET的POST,除非你的期望是,這將是一個導航的頁面/或端點綁定到該電子郵件地址(即某個人可能書籤)認爲GET操作是從查詢字符串和指定位置讀取某些內容POST與進行與發佈數據相關的某些特定操作有關。

  • 您應該考慮使用filter_var()filter_input()與電子郵件驗證過濾器,而不是正則表達式一起。

建議用法是:

$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL); 
if(false === $email) { 
    // validation failed 
} 
// or 
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL); 
if(is_null($email) { 
    // key was not present in GET params 
} else if (false === $email) { 
    // validation failed 
}