2012-02-14 37 views
3

請考慮以下事項。我分裂在{標籤},這是在它們之間的具有字符(和/或數字)的任何數量大括號的字符串:在標記上拆分字符串,刪除空結果

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

所得陣列($溫度)是:

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

如果分割樣式是字符串的最後一個元素,那麼您當前的表達式/(\{.*?\})/可以更改爲不分割。 /(\{.*?\})(?!$)/使用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 2012-02-14 14:42:09

+1

我提前點擊保存按鈕,對不起。現在查看完整答案... – rodneyrehm 2012-02-14 14:44:33

相關問題