2016-05-27 6 views
0

文字列"/test:n(0-2)/div/"をRegex経由で配列に分割したいと思います。出力は次のようになります。PHP正規表現/デリミタ

output = { 
[0]=>"test:n(0-2)" 
[1]=>"div" 
} 

しかし、それは私が思っていたほど簡単ではないようです。ここに私の試みです:https://regex101.com/r/iP2lD8/1

私は間違って何ですか?

答えて

3

だけexplode()を使用します。

$result = array_filter(explode('/', $string)); 

array_filter()は、どちらかの端に/から空に削除されます。

$result = explode('/', trim($string, '/')); 

しかし、質問に答えるために、あなただけのpreg_split()ためのパターンとして/を使用して/\//のよう/をエスケープするか、別の区切り文字を使用するかになります:

$result = array_filter(preg_split('#/#', $string)); 

もう一つ別の方法として、あなたはそれtrim()できました文字列のコンテンツのニーズと複雑さに応じて、次のようになります。

preg_match_all('#/([^/]+)#', $string, $result); 
print_r($result[1]); 

$result[0]は完全一致の配列で、$result[1]は最初のキャプチャグループ()の配列です。より多くのキャプチャグループがある場合、より多くの配列要素が$resultにあります。

+0

が動作しない、これに対する結果である:配列 ( [1] =>表 [2]> TR =:N(1-2) ) – marius

+0

同じ問題2番目のオプションの場合:/ – marius

+0

これらはすべて動作しません。https://3v4l.org/4jFAv間違っていることがわかりません。 – AbraCadaver

0

あなたは

'~/([^/]+)~' 

regex demoを参照してください使用することができます。このパターンは/と一致し、グループ1に取り込み、/以外の1文字以上をキャプチャします。

問題は、後続のスラッシュが消費されたことです。また、あなたは貪欲なマッチングを使用して、それはあまりにも多くをつかんだ。

Ideone demo

$re = '~/([^/]+)~'; 
$str = "/test:n(0-2)/div/"; 
preg_match_all($re, $str, $matches); 
print_r($matches[1]); 
+0

なぜ$ matches [1]に保存されますか?私は$ matches [0]と$ matches [1]の最初の出現を期待していたでしょう。[1] – marius

+0

あなたの持っている部品の数によって異なります。それは常にちょうど2ですか?すると、 ''〜/([^ /] +)/([^ /] +)〜 ''](https://regex101.com/r/nV6eC7/2)が役立ちます。 [** this demo **](http://ideone.com/oDMipZ)を参照してください。 –