2

次のコードがあります

$str = "keyword keyword 'keyword 1 and keyword 2' another 'one more'".'"another keyword" yes,one,two';

preg_match_all('/"[^"]+"|[^"\' ,]+|\'[^\']+\'/', $str, $matches);

echo "<pre>"; print_r($matches); echo "</pre>";

文字列からキーワードを抽出し、それらを一重引用符または二重引用符で囲んで保持したい場合、上記のコードは問題なく動作しますが、引用符を含む値が返されます。str_replace などを使用してこれらを削除できることはわかっていますが、 preg_match_all 関数を使用してこれを解決する方法を本当に探しています。

出力:

Array
(
    [0] => Array
        (
            [0] => keyword
            [1] => keyword
            [2] => 'keyword 1 and keyword 2'
            [3] => another
            [4] => 'one more'
            [5] => "another keyword"
            [6] => yes
            [7] => one
            [8] => two
        )

)

また、私の正規表現は少しずさんだと思うので、より良い提案があれば良いでしょう:)

任意の提案/ヘルプをいただければ幸いです。

4

4 に答える 4

1

あなたはほとんどそれを手に入れました。ルックアラウンドを使用して引用符を一致させるだけです。

'/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/'
于 2009-06-24T12:35:30.010 に答える
1
preg_match_all('/"([^"]+)"|[^"\' ,]+|\'([^\']+)\'/',$str,$matches);

と を使用$matches[1]$matches[2]ます。

于 2009-06-24T11:37:03.530 に答える
0

これには、必要なものを取得するための単純な関数が必要ですが、機能します

preg_match_all('/"([^"]+)"|([^"\' ,]+)|\'([^\']+)\'/',$str,$matches);
function r($str) {
    return str_replace(array('\'','"'), array(''), $str);
}
$a = array_map('r', $matches[0]);
print_r($a);
于 2009-06-24T12:32:26.163 に答える
0

functionへのコメントでこのtokenizeQuote関数を見てください。strtok

編集   元は二重引用符でのみ機能するため、関数を変更する必要があります。

function tokenizeQuoted($string)
{
    for ($tokens=array(), $nextToken=strtok($string, ' '); $nextToken!==false; $nextToken=strtok(' ')) {
        $firstChar = $nextToken{0};
        if ($firstChar === '"' || $firstChar === "'") {
            $nextToken = $nextToken{strlen($nextToken)-1} === $firstChar
                ? substr($nextToken, 1, -1)
                : substr($nextToken, 1) . ' ' . strtok($firstChar);
        }
        $tokens[] = $nextToken;
    }
    return $tokens;
}

編集  たぶん、独自のパーサーを作成する必要があります。  

$tokens = array();
$buffer = '';
$quote = null;
$len = strlen($str);
for ($i=0; $i<$len; $i++) {
    $char = $str{$i};
    if ($char === '"' || $char === "'") {
        if ($quote === null) {
            if ($buffer !== '') {
                $tokens[] = $buffer;
                $buffer = '';
            }
            $quote = $char;
            continue;
        }
        if ($quote == $char) {
            $tokens[] = $buffer;
            $buffer = '';
            $quote = null;
            continue;
        }
    } else if ($char === ',' || $char === ' ') {
        if ($quote === null) {
            if ($buffer !== '') {
                $tokens[] = $buffer;
                $buffer = '';
            }
            continue;
        }
    }
    $buffer .= $char;
}
if ($buffer !== '') {
    $tokens[] = $buffer;
}
于 2009-06-24T11:36:50.893 に答える