Способ сделать несколько preg_replace более понятными - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь преобразовать введенную строку для соответствия диапазонам, и вот строки, которые я сделал до сих пор:

$targets = "1-  6;20; 20-4,71100  12";
$ranges = preg_split("/[,;]/",    // Splits sthe string into an array on any comma , or semicolon ; encountered
    preg_replace("/[\s]/", "",   // Removes remaining white spaces
        preg_replace("/[^;][\s]+/", ";",  // Replaces all white spaces that are not preceded by a semicolon ; by a semicolon ;
            preg_replace("/[\s]*[-][\s]*/", "-", $targets)   // Replaces all dashes - surrounded by any number of white spaces by a single dash -
        )
    )
);

Эти строки работают довольно хорошо, но я бы хотел сделать их болеекрасивый ... Вот вывод:

  array (size=5)
  0 => string '1-6' (length=3)
  1 => string '20' (length=2)
  2 => string '20-4' (length=4)
  3 => string '7110' (length=4)
  4 => string '12' (length=2)

Вопрос: есть ли способ сделать это яснее?(Например, связывание результатов с заменой в массиве?) Не могли бы вы привести несколько примеров, я не очень горжусь этими строками: / Спасибо

1 Ответ

0 голосов
/ 20 сентября 2018

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

Чтобы извлечь диапазоны, регулярное выражение может выглядеть как

'~\d+(?:\s*-\s*\d+)?~'

См. Демоверсию regex .\d+(?:\s*-\s*\d+)? будет соответствовать 1+ цифрам с последующей необязательной последовательностью -, заключенной в 0+ пробелов, а затем 1+ цифр.

В PHP:

$targets = "1-  6;20; 20-4,71100  12";
if (preg_match_all('~\d+(?:\s*-\s*\d+)?~', $targets, $m)) {
    print_r(preg_replace('~\s+~', '', $m[0]));
};

preg_replace('~\s+~', '', $m[0]) удалит все пробелы из совпадений.

Если у вас может быть пробел Unicode, добавьте модификатор u к вызову preg_replace:

preg_replace('~\s+~u', '', $m[0]) 

Вывод:

Array
(
    [0] => 1-6
    [1] => 20
    [2] => 20-4
    [3] => 71100
    [4] => 12
)
...