0

我想在 PHP 中分解这种字符串:

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

我想把它爆炸成:

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

我知道我可以使用 preg_split 但我不知道应该把什么作为正则表达式。

有人可以帮助我吗?

4

3 回答 3

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));
于 2013-01-12T17:45:32.617 回答
2

这是一个时髦的非正则表达式“解析器”。各种好玩正则表达式出现之前的世界是什么样的?我的意思是,它一定是工作;)

<?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

于 2013-01-12T17:55:01.607 回答
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 但它会比上面慢

于 2013-01-12T17:48:38.787 回答