2010-11-13 58 views
0

我正在使用preg_match函數從2個PHP腳本中的textarea窗體中過濾不需要的字符,但在其中一個腳本中似乎不起作用。preg_match函數在某些PHP腳本中無法正常工作

這裏是有問題的腳本:

<?php 
    //Database connection, etc...... 

    mysql_select_db("etc", $con); 
    $errmsg = ''; 
    $chido = $_POST['chido']; 
    $gacho = $_POST['gacho']; 
    $maestroid = $_POST['maestroid']; 
    $comentario = $_POST['comment']; 
    $voto = $_POST['voto']; 

    if($_POST['enviado']==1) { 
     if (preg_match ('/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/i', $comentario)) 
      $errmsg = 1; 
     if($errmsg == '') { 
      //here's some queries, etc 
     } 
    } 

    if($errmsg == 1) 
     echo "ERROR: You inserted invalid characters..."; 
?> 

因此,大家可以看到的preg_match只是過濾不需要的chracters比如「#$%& /()等。

但每次我鍵入一個特殊的字符,如'ñ'或'á'它觸發錯誤代碼

我有這個非常相似的腳本,完美地使用相同的preg_match並過濾不需要的字符:

//Database connection, etc.. 
mysql_select_db("etc", $con); 
$errmsg = ''; 

if ($_POST['enviado']==1) { 
    $nombre = $_POST['nombre']; 
    $apodo = $_POST['apodo']; 
    $mat1 = $_POST['mat1']; 
    $mat2 = $_POST['mat2']; 
    $mat3 = $_POST['mat3']; 

    if (preg_match ('/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/i', $nombre)) 
     $errmsg = 1; 


    if($errmsg == '') { 
     //more queries after validation 
    } 
} 

if($errmsg == 1) 
    echo "ERROR: etc......." 
?> 

所以問題是,我在做第一個腳本錯誤?

我嘗試了一切,但總是失敗並顯示錯誤。

有什麼建議嗎?

+0

在用'preg_match'測試之前,打印'$ comentario'的值,確保它包含你認爲它包含的內容。我們不能在不知道您使用的輸入的情況下爲您進行調試。 – meagar 2010-11-13 04:50:19

+0

好吧,讓我試試。 – Danny 2010-11-13 04:51:26

+0

我在第一個IF之前和之後回顯變量,並打印出我輸入的內容,包括'ñ'等。 另外,當我將事件添加到像0-9這樣的preg_match似乎做出了正確的更改,不過濾數字,唯一的問題實際上只發生在像'ñ'這樣的特殊字符上。 – Danny 2010-11-13 04:55:56

回答

1

嘗試在結束與你我使用unicode

/[^a-zA-Z áéíóúüñÁÉÍÓÚÜÑ]/iu 
+0

我加了你,仍然接受不需要的字符。 – Danny 2010-11-13 05:08:28

+0

$農佈雷= 「(adsfá」; 如果(的preg_match( '/ [^ A-ZA-ZáéíóúüñÁÉÍÓÚÜÑ]/IU',$農佈雷)) 回聲 「的比賽!」; 作品對我來說... – KeatsKelleher 2010-11-13 05:10:52

+0

是,它可以工作,但現在可以接受任何字符,比如!「#$%&/()=?等等。我不想要那些字符。 – Danny 2010-11-13 05:17:16

0

我已將此添加到表單一起加入U形。

<form accept-charset="utf-8">. 

現在似乎工作。

0

你爲什麼要指定/i還要分別枚舉所有的大小寫字母?

ALSO:如果您沒有對輸入進行規範化處理,則完全不起作用。考慮ñ既可以是字符U + F1 字符U + 4E其次是U + 303!

  • Unicode範式d將保證兩個U + F1和U + 4E,U + 303轉進標準地分解形式U + 4E,U + 303。

  • Unicode標準化形式C將保證兩個U + F1和U + 4E,U + 303轉成表格U + 4E,因爲它使用標準分解,接着典型組合物。

根據你的模式,它看起來像你想要的NFC形式。

從PHP,你需要使用這些Normalization class讓它工作可靠。

/^[a-z]\d_]+$/i 

因爲我接受字母從a到z,數字從0到9和下劃線「_」,加號「+」來重複通過:我使用此匹配表達式之前

+0

我知道/ i在示例中是無用的,但僅用於演示目的(根本不影響我的preg_match)無論如何,我已經解決了添加到我的html表單的問題

我不知道爲什麼這個問題解決了,另一個表單我使用的第二個腳本沒有這個屬性,工作沒有問題。 – Danny 2010-11-13 22:52:51

1

您好整個字符串,和'/我'進行不敏感的匹配。但我需要接受這封信。

所以,我嘗試了,對我的工作就是用這個正則表達式:

/^[a-z\d_\w]+$/iu 

我加了「\ W」接受任何單詞字符,並且還增加了一個「U」後'/ I治療該模式爲UTF-16字符集,而不是UTF-8。

0

我不知道這是否可以幫助,但我有那些特殊字符完全相同的問題,並在最後讓我瘋了很多天我明白,問題是一個html_entities()命令消毒在preg_match()中運行之前的字符串,在prey_match()之後移動html_entities()使其工作得很好。