3

我正在尝试使用分隔符捕获在引号字符 (") 上拆分 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"
}

有人可以帮我完成这项工作吗?

4

2 回答 2

4

既然您说您不介意拆分时使用的引号,您可以使用以下表达式:

(?<!")\s?"\s?(?!")

使用两个负面环视的地方。您的样本输出将是:

{ 
A ""B"" C
&
D ""E"" F
}

[我把\s?消耗掉任何尾随空间,如果你想保留它们,请将它们删除]

于 2013-08-11T16:16:18.763 回答
3

我认为它可能更容易使用preg_match_all

preg_match_all('/"([^"]|"")+"|[^"]+/', $string, $matches);

这是一个演示。正则表达式匹配带引号的字符串或不匹配带引号的字符串,因此如果最后一部分没有右引号,它将忽略它;这可能需要更改,具体取决于您的情况。

于 2013-08-11T16:09:56.693 回答