
timofey
¿Cómo puedo explotar la siguiente cadena:
Lorem ipsum "dolor sit amet" consectetur "adipiscing elit" dolor
dentro
array("Lorem", "ipsum", "dolor sit amet", "consectetur", "adipiscing elit", "dolor")
De modo que el texto entre comillas se trata como una sola palabra.
Esto es lo que tengo por ahora:
$mytext = "Lorem ipsum %22dolor sit amet%22 consectetur %22adipiscing elit%22 dolor"
$noquotes = str_replace("%22", "", $mytext");
$newarray = explode(" ", $noquotes);
pero mi código divide cada palabra en una matriz. ¿Cómo hago que las palabras entre comillas se traten como una sola palabra?

bart kiers
Podrías usar un preg_match_all(...)
:
$text="Lorem ipsum "dolor sit amet" consectetur "adipiscing \\"elit" dolor";
preg_match_all("https://stackoverflow.com/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches);
print_r($matches);
que producirá:
Array
(
[0] => Array
(
[0] => Lorem
[1] => ipsum
[2] => "dolor sit amet"
[3] => consectetur
[4] => "adipiscing \"elit"
[5] => dolor
)
)
Y como puede ver, también tiene en cuenta las comillas escapadas dentro de las cadenas entrecomilladas.
EDITAR
Una breve explicación:
" # 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
Y en caso de coincidencia %22
en lugar de comillas dobles, harías:
preg_match_all('/%22(?:\\\\.|(?!%22).)*%22|\S+/', $text, $matches);

petah
Esto hubiera sido mucho más fácil con str_getcsv()
.
$test="Lorem ipsum "dolor sit amet" consectetur "adipiscing elit" dolor";
var_dump(str_getcsv($test, ' '));
Te dio
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"
}

Nikz
También puedes probar esta función de explosión múltiple
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);

clong
En algunas situaciones lo poco conocido token_get_all()
podría resultar útil:
$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;
}
}
}
Resultados:
Array
(
[0] => Lorem
[1] => ipsum
[2] => dolor sit amet
[3] => consectetur
[4] => adipiscing elit
[5] => dolor
)
Esto suena como un trabajo para Regex
– Condez
4 de febrero de 2010 a las 19:10
Consulte también ¿Una función de explosión () que ignora los caracteres dentro de las comillas?
– Bergi
10/09/2013 a las 21:43