PHP dize patlayabilir, ama tek bir kelime olarak tırnak sözcükleri tedavi

4 Cevap php

Nasıl şu dizeyi patlayabilir:

Lorem ipsum "dolor sit amet" consectetur "adipiscing elit" dolor

içine

array("Lorem", "ipsum", "dolor sit amet", "consectetur", "adipiscing elit", "dolor")

Tırnak içinde metin tek bir kelime olarak kabul edilir şekilde.

İşte ben şimdi ne var:

$mytext = "Lorem ipsum %22dolor sit amet%22 consectetur %22adipiscing elit%22 dolor"
$noquotes = str_replace("%22", "", $mytext");
$newarray = explode(" ", $noquotes);

but my code divides each word içine an array. How do I make words inside quotation marks treated as one word?

4 Cevap

Sen kullanabilirsiniz bir preg_match_all(...):

$text = 'Lorem ipsum "dolor sit amet" consectetur "adipiscing \\"elit" dolor';
preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches);
print_r($matches);

üretecek:

Array
(
    [0] => Array
        (
            [0] => Lorem
            [1] => ipsum
            [2] => "dolor sit amet"
            [3] => consectetur
            [4] => "adipiscing \"elit"
            [5] => dolor
        )

)

Gördüğünüz gibi, o da tırnaklı dizge içinde kaçtı tırnak oluşturmaktadır.

EDIT

Kısa bir açıklama:

"           # match the character '"'
(?:         # start non-capture group 1 
  \\        #   match the character '\'
  .         #   match any character except line breaks
  |         #   OR
  [^\\"]    #   match any character except '\' and '"'
)*          # end non-capture group 1 and repeat it zero or more times
"           # match the character '"'
|           # OR
\S+         # match a non-whitespace character: [^\s] and repeat it one or more times

Yerine çift tırnak ve eşleme durumunda %22, sen yapardın:

preg_match_all('/%22(?:\\\\.|(?!%22).)*%22|\S+/', $text, $matches);

Bu çok daha kolay olurdu ...

$test = 'Lorem ipsum "dolor sit amet" consectetur "adipiscing elit" dolor';
var_dump(str_getcsv($test, ' '));

Verir

array(6) {
  [0]=>
  string(5) "Lorem"
  [1]=>
  string(5) "ipsum"
  [2]=>
  string(14) "dolor sit amet"
  [3]=>
  string(11) "consectetur"
  [4]=>
  string(15) "adipiscing elit"
  [5]=>
  string(5) "dolor"
}

Ayrıca bu birden patlayabilir işlevi deneyebilirsiniz

function multiexplode ($delimiters,$string)
{

$ready = str_replace($delimiters, $delimiters[0], $string);
$launch = explode($delimiters[0], $ready);
return  $launch;
}

$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$exploded = multiexplode(array(",",".","|",":"),$text);

print_r($exploded);

Açıklayıcı cevap:

  1. Tırnak arasındaki tüm boşlukları maç ve bir alt çizgi (preg_match vaka) ile değiştirin
  2. patlayabilir kullanmak ("", $ result_from_step1)
  3. şimdi alanlar ile çizgi yerine

I kolayca anlamaya inanıyorum dinlenmek :)

Selamlar,