仅在未被[,<,{或],>,}包围的情况下按空格拆分

时间:2012-01-27 10:57:40

标签: php regex

我有一个像这样的字符串:

traceroute <ip-address|dns-name> [ttl <ttl>] [wait <milli-seconds>] [no-dns] [source <ip-address>] [tos <type-of-service>] {router <router-instance>] | all}

我想创建一个这样的数组:

$params = array(
       <ip-address|dns-name>
       [ttl <ttl>]
       [wait <milli-seconds]
       [no-dns]
       [source <ip-address>]
       [tos <tos>]
       {router <router-instance>] | all}
);

我应该使用preg_split('/someregex/', $mystring)吗? 或者有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

使用负面外观。这个使用<的负前瞻。这意味着如果它在空格之前找到<,它将不会拆分。

$regex='/\s(?!<)/';
$mystring='traceroute <192.168.1.1> [ttl <120>] [wait <1500>] [no-dns] [source <192.168.1.11>] [tos <service>] {router <instance>] | all}';

$array=array();

$array = preg_split($regex, $mystring);

var_dump($array);

我的输出是

array
  0 => string 'traceroute <192.168.1.1>' (length=24)
  1 => string '[ttl <120>]' (length=11)
  2 => string '[wait <1500>]' (length=13)
  3 => string '[no-dns]' (length=8)
  4 => string '[source <192.168.1.11>]' (length=23)
  5 => string '[tos <service>]' (length=15)
  6 => string '{router <instance>]' (length=19)
  7 => string '|' (length=1)
  8 => string 'all}' (length=4)

答案 1 :(得分:1)

是的,preg_split很有意义,可能是最有效的方法。

尝试:

preg_split('/[\{\[<](.*?)[>\]\}]/', $mystring);

或者如果您想匹配而不是拆分,您可能想尝试:

$matches=array();
preg_match('/[\{\[<](.*?)[>\]\}]/',$mystring,$matches);
print_r($matches);

<强>更新

我错过了你想要获得令牌,而不是令牌的内容。我认为你将需要使用preg_match。尝试这样的事情是一个良好的开端:

$matches = array();
preg_match_all('/(\{.*?[\}])|(\[.*?\])|(<.*?>)/', $mystring,$matches);
var_dump($matches);

我明白了:

Array
(
[0] => Array
    (
        [0] => <ip-address|dns-name>
        [1] => [ttl <ttl>]
        [2] => [wait <milli-seconds>]
        [3] => [no-dns]
        [4] => [source <ip-address>]
        [5] => [tos <type-of-service>]
        [6] => {router <router-instance>] | all}
    )

答案 2 :(得分:1)

您可以使用preg_match_all,例如:

preg_match_all("/\\[[^]]*]|<[^>]*>|{[^}]*}/", $str, $matches);

$matches数组中获取结果。