Извлечение ключевых слов / тегов из строки с помощью Preg_match_all - PullRequest
2 голосов
/ 24 июня 2009

У меня есть следующий код

<code>$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 "
";

Где я хочу извлечь ключевые слова из строки и сохранить их в одинарных или двойных кавычках, этот код работает хорошо, но возвращает значения с кавычками. Я знаю, что могу удалить их через 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 ]

1 голос
/ 24 июня 2009

Вы почти получили это; вам просто нужно использовать lookarounds для соответствия кавычкам:

'/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/'
1 голос
/ 24 июня 2009
preg_match_all('/"([^"]+)"|[^"\' ,]+|\'([^\']+)\'/',$str,$matches);

и используйте $matches[1] и $matches[2].

0 голосов
/ 24 июня 2009

для получения того, что вы хотите, требуется простая функция, но она работает

preg_match_all('/"([^"]+)"|([^"\' ,]+)|\'([^\']+)\'/',$str,$matches);
function r($str) {
    return str_replace(array('\'','"'), array(''), $str);
}
$a = array_map('r', $matches[0]);
print_r($a);
0 голосов
/ 24 июня 2009

Взгляните на эту 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;
}
...