PHP explodieren die Zeichenfolge, sondern behandeln Wörter in Anführungszeichen als ein einzelnes Wort

StackOverflow https://stackoverflow.com/questions/2202435

Frage

Wie kann ich explodieren die folgende Zeichenfolge:

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

in

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

Damit der Text in Anführungszeichen als ein einzelnes Wort behandelt wird.

Hier ist, was ich für jetzt:

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

aber mein Code teilt jedes Wort in ein Array. Wie mache ich Wörter in Anführungszeichen als ein Wort behandelt?

War es hilfreich?

Lösung

Sie könnten eine preg_match_all(...) verwenden:

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

, welche erzeugt:

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

)

Und wie Sie sehen können, ist allerdings auch für entkam Anführungszeichen innerhalb Strings in Anführungszeichen.

Bearbeiten

Eine kurze Erklärung:

"           # 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

Und bei %22 statt doppelte Anführungszeichen passend, dann würden Sie tun:

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

Andere Tipps

Das wäre viel einfacher gewesen mit str_getcsv() .

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

Gibt Ihnen

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"
}

Sie können auch versuchen, diese Mehrfachfunktion explodiert

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);

In einigen Situationen die wenig bekannte token_get_all() könnte sich als nützlich erweisen :

$tokens = token_get_all("<?php $text ?>");
$separator = ' ';
$items = array();
$item = "";
$last = count($tokens) - 1;
foreach($tokens as $index => $token) {
    if($index != 0 && $index != $last) {
        if(count($token) == 3) {
            if($token[0] == T_CONSTANT_ENCAPSED_STRING) {
                $token = substr($token[1], 1, -1);
            } else {
                $token = $token[1];
            }
        }
        if($token == $separator) {
            $items[] = $item;
            $item = "";
        } else {
            $item .= $token;
        }
    }
}

Ergebnisse:

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

Ich kam hier mit einem komplexen String Splitting ähnlichen Problem wie diesen, aber keine der Antworten hier tat genau das, was ich wollte - so schrieb ich meine eigenen

.

ich es hier nur für den Fall bin Entsendung es an jemand anderen nützlich ist.

Dies ist wahrscheinlich ein sehr langsamer und ineffizienter Weg, es zu tun - aber es funktioniert für mich

.
function explode_adv($openers, $closers, $togglers, $delimiters, $str)
{
    $chars = str_split($str);
    $parts = [];
    $nextpart = "";
    $toggle_states = array_fill_keys($togglers, false); // true = now inside, false = now outside
    $depth = 0;
    foreach($chars as $char)
    {
        if(in_array($char, $openers))
            $depth++;
        elseif(in_array($char, $closers))
            $depth--;
        elseif(in_array($char, $togglers))
        {
            if($toggle_states[$char])
                $depth--; // we are inside a toggle block, leave it and decrease the depth
            else
                // we are outside a toggle block, enter it and increase the depth
                $depth++;

            // invert the toggle block state
            $toggle_states[$char] = !$toggle_states[$char];
        }
        else
            $nextpart .= $char;

        if($depth < 0) $depth = 0;

        if(in_array($char, $delimiters) &&
           $depth == 0 &&
           !in_array($char, $closers))
        {
            $parts[] = substr($nextpart, 0, -1);
            $nextpart = "";
        }
    }
    if(strlen($nextpart) > 0)
        $parts[] = $nextpart;

    return $parts;
}

Die Verwendung ist wie folgt. explode_adv dauert 5 Argumente:

  1. ein Array von Zeichen, die einen Block öffnen - z.B. [, (, etc.
  2. ein Array von Zeichen, die einen Block in der Nähe - z.B. ], ), etc.
  3. ein Array von Zeichen, die einen Block umzuschalten - z.B. ", ', etc.
  4. Eine Reihe von Zeichen, die eine Spaltung in den nächsten Teil führen sollen.
  5. Die Zeichenfolge zu arbeiten.

Diese Methode hat wahrscheinlich Mängel - Änderungen sind willkommen

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top