2012-04-17 73 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));