Вопрос по php, regex – Может ли preg_replace выполнять несколько операций поиска и замены за один раз?

4

Вот как это можно сделать в несколько строк:

<code>// $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"
</code>

Моя задача сосредоточена на объединении двух строк preg_replace () в одну preg_replace (), которая выполняет точно такую же работу.

Это возможно, и если это так, как это должно быть сделано?

Существует много разных применений для этого поведения, одно из которых я определяю как регулярное выражение как константу или переменную и использую это в функции класса для очистки и проверки пользовательского ввода.

Упрощенный пример такого класса:

<code>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;
    }
}
</code>

Этот способ проверки (regexp) может варьироваться в зависимости от входных данных, если это необходимо.

Ваш Ответ

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

preg_replace, он поддерживает несколько замен друг за другом.

+1 Это делает точно такую же работу. Одинаковый порядок замен, два сменных прогона, один за другим. Отлично.
@hakre Мне нравится, как ты это редактировал. Просто любопытно, что для этого вам нужны переменные $ pattern и $ replace? Не могли бы вы иметь анонимные массивы?
@SupremeDude: Технически, они вам не нужны, я оставил их, потому что они называют параметры, чтобы было легче понять, что это такое. Но это сахар, который вы можете сказать.
Идеально подходит, я даже не помню, сколько раз я уже читал страницы справочника preg_replace и до сих пор скучал по нему. Еще раз спасибо за указание мне в правильном направлении. Sampo Sarrala
0

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

Похожие вопросы