2012-04-17 5 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はまったく同じ仕事をして1にpreg_replace()に2にpreg_replace()の行を組み合わせることで焦点を当てています。

どうすればいいですか?


その行動のための多くの異なる用途、私は後に定数または変数として正規表現を定義し、クリーンアップし、ユーザー入力を検証するために、クラスの関数内であることを使用されています1があります。 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これはまったく同じ仕事です。同じ順序の置換、2つの置換の実行、順番に並びます。結構。 – hakre

+2

@hakreあなたが編集した方法が好きです。ちょうど興味深いことに、この方法で$パターンと$置換変数が必要なのでしょうか?配列を匿名にすることができますか? – SupremeDud

+1

@SupremeDude:技術的には、それらを必要とせず、パラメータに名前を付けるために残しました。何が何であるかを読むのが簡単です。しかし、それはあなたが言うことができる砂糖です。 – hakre

0

確か;しかし、それはやや難解です。

$str = trim(preg_replace('/[\x00-\x09\x0B-\x1F\x7F\s]*\s[\x00-\x09\x0B-\x1F\x7F\s]*/', ' ', $str)); 
関連する問題