preg_split按空格和制表符分割字符串,但在引号外部。

3
我正在尝试使用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个回答

4
只需按照以下正则表达式拆分输入。 \h+ 匹配一个或多个水平空格字符,即空格,制表符。
(?:'[^']*'|"[^"]*")(*SKIP)(*F)|\h+

(?:'[^']*'|"[^"]*") 匹配所有单引号和双引号字符串。(*SKIP)(*F) 使匹配失败,并选择由|后面的模式匹配的所有字符。在我们的例子中,它是\h+,它匹配一个或多个水平空格。

演示

$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"
)

我更喜欢 (['"])[^'"]*\1(*SKIP)(*F)|\h+ - hwnd
哇,我从来不知道 *SKIP*F - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接