Php 拆分标记上的字符串,删除空结果
考虑以下几点。我在{tags}上拆分一个字符串,它们是大括号,中间有任意数量的字符(和/或数字):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
$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}。这是您试图做的还是我没有正确理解您的评论?我过早地点击了保存按钮,对此表示抱歉。现在看到完整的答案…