一种使多个preg_replace更清晰的方法

时间:2018-09-20 13:44:19

标签: php regex pcre

我正在尝试将输入的字符串转换为匹配范围,这是我到目前为止所做的行:

$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 :(得分:0)

您可以将范围与内部的空格匹配,并在获得它们的数组后,删除所有种类的空格。

要提取范围,正则表达式可能类似于

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

请参见regex demo\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
)