2012-03-16 111 views
0

早安編碼小夥子,正則表達式清潔方法PHP

我正在寫一個小的正則表達式的特殊字符(&,*等)

這是我的代碼看起來像太乾淨的文件名:

public function clean($string, $bool = false) 
{ 
    $string = html_entity_decode($string, ENT_QUOTES); 
    $string = str_replace("'", "", $string); 
    $string = str_replace('"', "", $string); 
    $string = str_replace("&", "en", $string); 
    $string = str_replace("-", "_", $string); 

    //ALLE VAGE TEKENS VERVANGEN MET _ 
    $weirdChars = Proces::normalInput($string , true); 

    if(count($weirdChars[0]) > 0) 
    { 
     foreach($weirdChars[0] as $char) 
     { 
      $string = str_replace($char, "_", $string); 
     } 
    } 

    if($bool) 
    $string = ucfirst(preg_replace('!_+!', '_', strtolower($string))); 
    else 
    $string = preg_replace('!_+!', '_', strtolower($string)); 

    if(isset($string[0]) && $string[0] == "_") 
    $string = substr($string, 1); 
    if(substr($string, -1) == "_") 
    return substr($string,0,-1); 

    return $string; 
} 

public function normalInput($string, $bool = false) //STRING 
{ 
    $patern = '/[^_a-zA-Z0-9-]/'; 
    if(preg_match_all($patern, $string, $matches)) 
    { 
    if($bool) 
     return $matches; 
    else 
    return false; 
    } 
    else 
    { 
    if($bool) 
     return $matches; 
    else 
    return true; 
    } 
} 

這2種方法一起工作,可以正常使用,但我注意到一個小問題。 我在normalInput方法使用的模式是這樣的:

$patern = '/[^_a-zA-Z0-9-]/'; 

這是好的,但我想排除在文件名中的點(否則我的文件擴展名將會得到像blaatfoo_pdf代替blaatfoo.pdf)。

你能幫我解決這個問題嗎?

親切的問候,

的Jordy SUOS(取一杯咖啡,在這個美麗的早晨..一個不錯的sigarette ON ME)

回答

3

Goedemorgen。 ;-)

您可以使用白名單或黑名單:

// Whitelist alphanumeric, underscore, dash and dot 
$str = preg_replace("/[^a-z0-9-_\.]/", "_", strtolower($str)); 

// Blacklist 
$str = preg_replace("/[<>'\"\\\/\?\: (... and more) ]/", "_", strtolower($str)); 

這是所有有它,所以你不需要兩個函數計算50行。我更喜歡白名單的方法,因爲你永遠不會知道你將接收哪些字符作爲輸入,並且在你的文件名中有很多你不想要的字符。

我也建議看看你的變量和函數的命名,因爲$bool不是真正的描述。如果你願意,可以叫它$ucFirst

+0

頂部,bedankt)! – Jordy 2012-03-16 10:56:26

0

你可能想也試試這個:

$file_parts = pathinfo($string); 
$bad_chars = array_merge(array_map('chr', range(0,31)),array("<", ">", ":", '"', "/", "\\", "|", "?", "*", ".")); 
$filename = str_replace($bad_chars, "_", $file_parts['filename']); 
$string = $filename . "." . $file_parts['extension'];