我正在尝试使用分隔符捕获在引号字符(“)上拆分UTF-8字符串,除非该引号后跟第二个引号(”“),以便(例如)
"A ""B"" C" & "D ""E"" F"
将分为三个元素
"A ""B"" C"
&
"D ""E"" F"
我一直试图使用:
$string = '"A ""B"" C" & "D ""E"" F"';
$temp = preg_split(
'/"[^"]/mui',
$string,
null,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE
);
但没有成功,因为它给了我
array(7) {
[0]=>
string(2) " ""
[1]=>
string(1) """
[2]=>
string(1) "C"
[3]=>
string(2) "& "
[4]=>
string(2) " ""
[5]=>
string(1) """
[6]=>
string(2) "F""
}
所以它会丢失任何紧跟引号的字符,除非该字符也是引用
在这个例子中,引号是字符串中的第一个和最后一个字符,但情况可能并非总是如此,例如。
{ "A ""B"" C" & "D ""E"" F" }
需要分成五个元素
{
"A ""B"" C"
&
"D ""E"" F"
}
有人可以帮我搞定吗?
答案 0 :(得分:4)
由于您说您不介意拆分时要使用的引号,您可以使用以下表达式:
(?<!")\s?"\s?(?!")
使用两个负面外观。样本的输出将是:
{
A ""B"" C
&
D ""E"" F
}
[我把\s?
用来消耗任何尾随空格,如果你想保留它们就把它们移除]
答案 1 :(得分:3)
我认为使用preg_match_all
可能更容易:
preg_match_all('/"([^"]|"")+"|[^"]+/', $string, $matches);
Here’s a demo.正则表达式匹配带引号的字符串或不带引号的字符串,因此如果最后一部分没有结束引号,它将忽略该字符串;可能需要更改,具体取决于您的情况。