我想在PHP中爆炸这种字符串:
$foo = "foo.txt da\ code.txt bar.txt";
我想爆炸它:
["foo.txt", "da\ code.txt", "bar.txt"]
我知道我可以使用preg_split,但我看不出要用正则表达式放什么。
有人可以帮助我吗?
答案 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));
?>
答案 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 但它会慢于上面