preg_split由空格和制表符在引号外

时间:2015-02-18 13:29:58

标签: php regex preg-split

我想让preg_split()按空格/制表符分割以下2个字符串(需要同时处理)。

autodiscover.microsoft.com. 3600 IN A   131.107.125.5

microsoft.com.      3600    IN  TXT "v=spf1 include:_spf-a.microsoft.com include:_spf-b.microsoft.com include:_spf-c.microsoft.com -all"

诀窍在于,在第二个实例中,带引号的最后一部分不应该被拆分。

从StackOverflow上看,我发现我可能需要使用它。

$results = preg_split("/'[^']*'(*SKIP)(*F)|\x20/", $str);
可悲的是,我无法让它发挥作用。 例如,我尝试了几件这样的事情,但没有任何作用。

"\s+"(*SKIP)(*F)|\x20

提前致谢。

1 个答案:

答案 0 :(得分:4)

根据以下正则表达式分割您的输入。 \h+匹配一个或多个水平空格字符,即空格,制表符。

(?:'[^']*'|"[^"]*")(*SKIP)(*F)|\h+

(?:'[^']*'|"[^"]*")匹配所有单引号和双引号字符串。 (*SKIP)(*F)会导致匹配失败并获取与|之后的模式匹配的所有字符。在我们的例子中,\h+匹配一个或多个水平空格。

DEMO

$str = 'microsoft.com.      3600    IN  TXT "v=spf1 include:_spf-a.microsoft.com include:_spf-b.microsoft.com include:_spf-c.microsoft.com -all"';
$match =  preg_split('~(?:\'[^\']*\'|"[^"]*")(*SKIP)(*F)|\h+~', $str);
print_r($match);

<强>输出:

Array
(
    [0] => microsoft.com.
    [1] => 3600
    [2] => IN
    [3] => TXT
    [4] => "v=spf1 include:_spf-a.microsoft.com include:_spf-b.microsoft.com include:_spf-c.microsoft.com -all"
)