PHP正则表达式按照特定模式拆分内容

时间:2018-10-27 13:55:14

标签: php regex

我正在尝试在php中编写一个正则表达式,以将字符串拆分为数组。 字符串是

#000000 | Black #ffffff | White #ff0000 | Red

字符和

之间可以有空格
|

所以正则表达式需要使用

#000000|Black #ffffff|White #ff0000|Red

第二种类型的字符串有效。

$str = preg_split('/[\s]+/', $str);

如何修改它以使其与第一个和第二个两个字符串一起使用?

编辑:最终输出必须为

Array ( [0] => Array ( [0] => #000000 [1] => Black ) [1] => Array ( [0] => #ffffff [1] => White ) [2] => Array ( [0] => #ff0000 [1] => Red) )

2 个答案:

答案 0 :(得分:1)

您需要先使用此正则表达式拆分两次,

'/ (?=#)/'

然后使用此正则表达式

'/\s*\|\s*/'

这是一个php代码,

$str = "#000000|Black #ffffff|White #ff0000|Red";
$str = preg_split('/ (?=#)/', $str);
for ($i = 0;$i<sizeOf($str);$i++) {
    $str[$i] = preg_split('/\s*\|\s*/', $str[$i]);
}
print_r($str);

这将提供以下输出,

Array
(
    [0] => Array
        (
            [0] => #000000
            [1] => Black
        )

    [1] => Array
        (
            [0] => #ffffff
            [1] => White
        )

    [2] => Array
        (
            [0] => #ff0000
            [1] => Red
        )

)

对于此字符串“#ff0000 |#ff0000”,它提供以下输出,这是您想要的。

Array
(
    [0] => Array
        (
            [0] => #ff0000
            [1] => #ff0000
        )

)

答案 1 :(得分:1)

我建议仅生成一个颜色名称到十六进制值的平面图。这是通过一次调用preg_split来实现的。我们可以尝试分割以下正则表达式模式:

\s*\|\s*|\s+(?=#)

这表示要在\s*\|\s*\s+(?=#)上进行拆分,这是空白,其后是十六进制颜色文字的哈希值。

$input = "#000000 | Black #ffffff | White #ff0000 | Red";
$array = preg_split("/\\s*\\|\\s*|\\s+(?=#)/", $input);

$map = array();
for ($i=0; $i < count($array); $i+=2) {
    $map[$array[$i]] = $array[$i+1];
}

print_r($map);

Array ( [#000000] => Black [#ffffff] => White [#ff0000] => Red )

我没有提供您期望的确切输出,但是我也看不到有任何关联数组的原因。如果确实需要,请使用以下代码:

$input = "#000000 | Black #ffffff | White #ff0000 | Red";
$array = preg_split("/\s*\|\s*|\s+(?=#)/", $input);

$output = array();
for ($i=0; $i < count($array); $i+=2) {
    $map = array();
    $map[$array[$i]] = $array[$i+1];
    $output[count($output)] = $map;
}

print_r($output);

Array ( [0] => Array ( [#000000] => Black ) [1] => Array ( [#ffffff] => White )
    [2] => Array ( [#ff0000] => Red ) )