2012-04-17 48 views
4

這是如何可以做到的,在幾行:Preg_replace可以一次性完成多個搜索和替換操作嗎?

// $str represents string that needs cleaning: 
$str = " String with line\nbreak and too much spaces "; 
// Clean string with preg_replace(): 
$str = preg_replace('/[\x00-\x09\x0B-\x1F\x7F]|^ +| +$/', '', $str); 
$str = preg_replace('/\x0A| +/', ' ', $str); 

echo $str; 
// Output: 
"String with line break and too much spaces" 

我quoestion集中在結合兩個的preg_replace()行成一個的preg_replace()所做的正是同樣的工作。

這是可能的,如果它是應該如何做?


沒有爲這種行爲,一個我之後是定義正則表達式爲恆定的或可變的,並使用該函數的類內進行清理和驗證用戶輸入的許多不同的用途。 suchs類的

簡化的例子:

class cleaner{ 
    protected $defined_methods = array(
    'TRIM' => '/ +/', 
    'STRIP_CC' => '/[\x00-\x1F\x7F]/', 
    'TRIM_STRIP_CC' => array('/[\x00-\x1F\x7F]/', '/ +/') 
    ); 
    protected $defined_results = array(
    'TRIM' => ' ', 
    'STRIP_CC' => '', 
    'TRIM_STRIP_CC' => array('', ' ') 
    ); 

    function clean(array $input, array $methods){ 
     foreach ($input as $key => $data){ 
      $input[$key] = preg_replace($defined_methods[$methods[$key]], $defined_results[$methods[$key]], $data); 
     } 
     return $input; 
    } 
} 

這種方式驗證方法(正則表達式)如果需要,可以用這樣的輸入數據而變化。

回答

7
$str = preg_replace(
    $patterns = array('/[\x00-\x09\x0B-\x1F\x7F]|^ +| +$/', '/\x0A| +/'), 
    $replace = array('',         ' '), 
    $str 
); 

請參閱preg_replace,它支持多個替換一個接一個。

+0

+1這完全一樣的工作。相同的替換順序,兩次替換運行,一個接一個。很好。 – hakre 2012-04-17 14:06:05

+2

@hakre我喜歡你編輯的方式。只是好奇,這樣做,你甚至需要$模式和$替換變量?你可以讓陣列是匿名的嗎? – SupremeDud 2012-04-17 14:15:17

+1

@SupremeDude:從技術上講,你不需要這些,因爲他們給參數命名,所以我把他們留在這裏,所以更容易理解什麼是什麼。但是你可以說這是糖。 – hakre 2012-04-17 14:17:11

0

當然;它有點棘手,但:

$str = trim(preg_replace('/[\x00-\x09\x0B-\x1F\x7F\s]*\s[\x00-\x09\x0B-\x1F\x7F\s]*/', ' ', $str));