引用Preg_split,除非后跟另一个引用

时间:2013-08-11 16:04:43

标签: php regex preg-split

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

有人可以帮我搞定吗?

2 个答案:

答案 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.正则表达式匹配带引号的字符串或不带引号的字符串,因此如果最后一部分没有结束引号,它将忽略该字符串;可能需要更改,具体取决于您的情况。