请考虑以下事项。我在{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] =>
)
显然,这可以通过检查空值来删除,但在我看来,这不是最优雅的方式。是否有一个替代方案(每个正则表达式可能?)在结果数组中没有空元素开始?
答案 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);