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 に答える