Php 拆分标记上的字符串,删除空结果

Php 拆分标记上的字符串,删除空结果,php,regex,Php,Regex,考虑以下几点。我在{tags}上拆分一个字符串,它们是大括号,中间有任意数量的字符(和/或数字): $string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar} samet"; $temp = preg_split('/(\{.*?\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 生成的数组($temp)是: 但是,如果$string以标记结尾,例如: $string = "Lorem {FOO} ipsu

考虑以下几点。我在{tags}上拆分一个字符串,它们是大括号,中间有任意数量的字符(和/或数字):

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

但是,如果$string以标记结尾,例如:

$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar}";
然后,生成的数组($temp)包含一个空元素(在本例中为#6):


显然,这可以通过检查空值来删除,但在我看来,这不是最优雅的方式。如果拆分模式是字符串的最后一个元素,那么在结果数组中没有空元素作为开头,是否有其他方法(可能是每个正则表达式?)可以将当前表达式
/(\{.*?\})/
更改为不拆分
/(\{.*?\})(?!$)/
使用(
(?!…)
)来确保您的模式仅在不后跟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);
$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar}";
$arr = preg_split('/(\{.*?\})/', $string, 0, 
                  PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );
print_r($arr);

是使用标志
PREG\u SPLIT\u NO\u EMPTY
如下:

<?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);
$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar}";
$arr = preg_split('/(\{.*?\})/', $string, 0, 
                  PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );
print_r($arr);
输出:

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

这个表达式的输出是:Array([0]=>Lorem[1]=>{FOO}[2]=>ipsum[3]=>{BAR}[4]=>dolor{FOO:BAR})-最后一个数组元素中有“dolor”和{FOO:BAR}。我要寻找的是:数组([0]=>Lorem[1]=>{FOO}[2]=>ipsum[3]=>{BAR}[4]=>dolor[5]=>{FOO:BAR}),在最后一个元素中单独包含{FOO:BAR}。这是您试图做的还是我没有正确理解您的评论?我过早地点击了保存按钮,对此表示抱歉。现在看到完整的答案…