我想在 PHP 中分解这种字符串:
$foo = "foo.txt da\ code.txt bar.txt";
我想把它爆炸成:
["foo.txt", "da\ code.txt", "bar.txt"]
我知道我可以使用 preg_split 但我不知道应该把什么作为正则表达式。
有人可以帮助我吗?
我想在 PHP 中分解这种字符串:
$foo = "foo.txt da\ code.txt bar.txt";
我想把它爆炸成:
["foo.txt", "da\ code.txt", "bar.txt"]
我知道我可以使用 preg_split 但我不知道应该把什么作为正则表达式。
有人可以帮助我吗?
您可以正面匹配任何以字母字符开头的空格。
<?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));
这是一个时髦的非正则表达式“解析器”。各种好玩。正则表达式出现之前的世界是什么样的?我的意思是,它一定是工作。;)
<?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));
?>
您可以使用 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 但它会比上面慢