Preg_match_all kullanarak dize Özü anahtar kelimeler / etiketler

4 Cevap php

Ben aşağıdaki kodu var

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

Ben bir dizeden anahtar kelimeleri ayıklamak, ve birlikte tek veya çift tırnak içine sarılmış olanlar nerede muhafaza edeceğinize, bu yukarıdaki kodu Tamam çalışır, ama bunun içinde tırnak değerleri döndürür. Ben str_replace veya benzeri ile bu kaldırabilirsiniz biliyorum, ama gerçekten preg_match_all fonksiyonu ile bu çözmek için bir yol arıyorum.

Çıktı:

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
        )

)

Ayrıca, benim regex biraz sulugöz olmak olduğunu düşünüyorum, bu yüzden daha iyi bir için herhangi bir öneriniz iyi olabilir :) olurdu

Herhangi bir öneri / yardım büyük mutluluk duyacağız.

4 Cevap

Neredeyse var; Sadece tırnak maç için lookarounds kullanmanız gerekir:

'/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/'
preg_match_all('/"([^"]+)"|[^"\' ,]+|\'([^\']+)\'/',$str,$matches);

ve $matches[1] ve $matches[2] kullanın.

Bu ne istediğinizi elde etmek için basit bir işlev gerektirir, ama çalışıyor

preg_match_all('/"([^"]+)"|([^"\' ,]+)|\'([^\']+)\'/',$str,$matches);
function r($str) {
    return str_replace(array('\'','"'), array(''), $str);
}
$a = array_map('r', $matches[0]);
print_r($a);