我有一个像这样的字符串:
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)
吗?
或者有更好的解决方案吗?
答案 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
数组中获取结果。