2012-02-14 10 views
3

以下を考慮してください。私は、それらの間の文字(および/または数字)のanynumberと中括弧は{タグ}、上の文字列を分割している:タグ上の文字列を分割し、空の結果を削除してください

$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar} samet"; 
$temp = preg_split('/(\{.*?\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 

得られた配列($のTEMP)は:

Array (
    [0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} 
    [4] => dolor [5] => {FOO:bar} [6] => samet 
) 
しかしながら

、$文字列のような、タグで終わる場合:次に

$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar}"; 

得られた配列($温度)(この場合、#6)空の要素が含ま:

Array (
    [0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} 
    [4] => dolor [5] => {FOO:bar} [6] => 
) 

明らかに、これは空の値をチェックすることで削除できますが、私の考えでは最もエレガントな方法ではありません。結果の配列に空の要素を持たないことに代わる(おそらく正規表現ごとに)代替がありますか?

答えて

3

はいこのようなフラグPREG_SPLIT_NO_EMPTYを使用:

$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar}"; 
$arr = preg_split('/(\{.*?\})/', $string, 0, 
        PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
print_r($arr); 

OUTPUT:

Array 
(
    [0] => Lorem 
    [1] => {FOO} 
    [2] => ipsum 
    [3] => {BAR} 
    [4] => dolor 
    [5] => {FOO:bar} 
) 
2

split-patternが文字列の最後の要素である場合は、現在の式/(\{.*?\})/を分割しないように変更することができます。 /(\{.*?\})(?!$)/は、negative look ahead assertion(?!…))を使用して、EOL($)が続けられていない場合、パターンが一致することを確認します。しかし、パターンはもはや認識されず、パターンの前の最後の要素とパターンが分離されません。残っているものは次のとおりです。

array(5) { 
    "Lorem " 
    "{FOO}" 
    " ipsum " 
    "{BAR}" 
    " dolor {FOO:bar}" 
} 

明らかにあなたが望むものではありません。最初に気になることは、分割結果の最初と最後の要素が空であるかどうかを確認することです。もしそうなら、それらを取り除く。多分このような:

<?php 

$string = "{FOO} ipsum {BAR} dolor {FOO:bar}"; 
$temp = preg_split('/(\{.*?\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 
$i = 0; 
if (isset($temp[$i]) && $temp[$i] === '') { 
    array_shift($temp); 
} 
$i = count($temp) -1; 
if (isset($temp[$i]) && $temp[$i] === '') { 
    array_pop($temp); 
} 

var_dump($temp); 
+0

この式の出力がある:配列([0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} [4] => dolor {FOO:bar}) - 最終的に "dolor"と{FOO:bar}配列要素。私が探しているのは、Array([0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} [4] => dolor [5] => { FOO:bar})を{FOO:bar}と一緒に使用します。これはあなたがやろうとしたことですか、あなたのコメントを正しく理解できませんでしたか? – Pr0no

+1

私は途中で保存ボタンを押しました。申し訳ありません。今すぐ完全な答えを見てください... – rodneyrehm

関連する問題