2012-01-27 21 views
1

[、<,{ or ],>、}で囲まれていない場合にのみ:スプリットが、私はこのような文字列を持っている

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)を使用しますか? それとも良いソリューションがありますか?

答えて

1

あなたはpreg_match_allなどとして使用できます。

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

そして$matches配列から、あなたの結果を得ます。

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} 
    ) 
+0

おかげで、しかし上でこの正規表現の分割である...私は2つの単語がこれらに囲まれていない場合にのみ、空白で分割したいですchars。 – Franquis

+0

@Franquisはこれをあなたのために働かせますか? –

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) 
関連する問題