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

时间:2012-02-14 14:08:48

标签: php regex

请考虑以下事项。我在{tags}上拆分了一个字符串,它们是花括号,中间有任意数字(和/或数字):

$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以标记结尾,例如:

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

然后生成的数组($ temp)包含一个空元素(在这种情况下为#6):

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

显然,这可以通过检查空值来删除,但在我看来,这不是最优雅的方式。是否有一个替代方案(每个正则表达式可能?)在结果数组中没有空元素开始?

2 个答案:

答案 0 :(得分: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);

<强>输出:

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

答案 1 :(得分:2)

如果split-pattern是字符串的最后一个元素,则当前表达式/(\{.*?\})/可以更改为NOT split。 /(\{.*?\})(?!$)/使用negative look ahead assertion(?!…))来确保您的模式仅匹配,如果它未跟随EOL($)。但是现在不再识别Pattern,导致模式之前的最后一个元素和模式没有被分开。你留下的是:

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);