仅在PHP中爆发未转义的空白区域

时间:2013-01-11 19:20:01

标签: php escaping whitespace explode

我想在PHP中爆炸这种字符串:

$foo = "foo.txt da\ code.txt bar.txt";

我想爆炸它:

["foo.txt", "da\ code.txt", "bar.txt"]

我知道我可以使用preg_split,但我看不出要用正则表达式放什么。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

对于任何前面带有字母字符的空格,您可以匹配正面外观。

<?php
$foo = "foo.txt da\ code.txt bar.txt";

print_r(preg_split("/(?<=[a-zA-Z])\s/", $foo));

您也可以对一般情况使用负面观察

<?php
$foo = "foo.txt da\ code.txt bar.txt something.mp3 other@ 9asdf";

print_r(preg_split('/(?<!\\\\)\s/', $foo));

答案 1 :(得分:2)

这是一个时髦的,非正则表达式&#34;解析器&#34;。所有的乐趣。 正则表达式之前的世界是什么样的?我的意思是,它一定是工作;)

<?php

$foo = "foo.txt da\ code.txt bar.txt";
$foos = array();
$char = 0;
$index = 0;
$lookback = '';

while ($char < strlen($foo)) {
    $lookback = $foo{$char-4} . $foo{$char-3} . $foo{$char-2} . $foo{$char-1} . $foo{$char};

    if ($lookback == '.txt ') $index++;

    $foos[$index] .= $foo{$char++};
}

print_r(array_map('trim', $foos));

?>

http://codepad.org/XMfLemeg

答案 2 :(得分:1)

你可以使用preg_split(),但它很慢,所以如果转义空间是你唯一的问题,那就更快就是这样做:

$array1 = explode(' ', $list);
$array2 = [];
$appendNext = false;
foreach($array1 as $elem)
{
    if ($appendNext)
    {
        array_push($array2, array_pop($array2) . ' ' . $elem);
    }
    else
    {
        $array2[] = $elem;
    }
    $appendNext = (substr($elem, -1) === '\\');
}
var_dump($array2);

如果你真的想通过正则表达式这样做,这是一个有效的解决方案:

print_r(preg_split("/(?<!\\\)\s/", $foo));

http://codepad.org/ngbDaxA3 但它会慢于上面