7
votes

Comment puis-je trouver tous les espaces blancs à l'exclusion des citations?

J'ai besoin de fractionner la chaîne par des espaces, mais une phrase entre guillemets doit être préservée non placée. Exemple:

array(
 [0] => 'word1',
 [1] => 'word2',
 [2] => 'this is a phrase',
 [3] => 'word3',
 [4] => 'word4',
 [5] => 'this is a second phrase',
 [6]  => 'word5'
)


2 commentaires

Cette question connexe semble exactement ce que vous voulez faire, sur la base des exemples que vous avez fournis. Avez-vous essayé cette réponse acceptée? Que s'est-il passé?


Oui, je l'ai essayé. J'utilise php, pas .net. Je ne peux pas utiliser le filtrage en ligne des résultats de Regeuxp. Et, comme je l'ai dit, \ W + | "[\ w \ s] *" ne fonctionne pas pour moi non plus


5 Réponses :


0
votes

En supposant que vos guillemets sont bien définis, c'est-à-dire par paires, vous pouvez exploser et passer en boucle tous les 2 champs. EG

$ php test.php
Spaces found: this is a phrase
Spaces found: this is a second phrase


1 commentaires

Bien sûr, je pouvais le faire sans regex, mais ce n'est pas mon cas.



0
votes

Utilisation de la regex de l'autre question que vous avez liée est plutôt facile? XXX PRE>

Sortie: P>

Array
(
     [0] => word1
     [1] => word2
     [2] => "this is a phrase"
     [3] => word3
     [4] => word4
     [5] => "this is a second phrase"
     [6] => word5
)


2 commentaires

Qu'en est-il du caractère spécial (ampersand par exemple) qui devraient également être trouvés? Et non seulement Ampersand sera non géré. De plus, différents symboles doivent être traités différemment. Par exemple, si les accolades rencontrées, je dois inclure ceux des résultats de recherche.


@altern, eh bien, je suis sûr que edds ne vous dérange pas d'ajuster son exemple à vos besoins ...



0
votes

Quelqu'un veut que quelqu'un veuille dire que la jognagie vs regex? Je suppose que la fonction explosion () est un peu trop faible pour une prestation de vitesse. Néanmoins, voici une autre méthode:

(édité parce que j'ai oublié l'affaire d'autre pour stocker la chaîne citée) em> p>

$str = 'word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5';

// initialize storage array
$arr = array();
// initialize count
$count = 0;
// split on quote
$tok = strtok($str, '"');
while ($tok !== false) {
    // even operations not in quotes
    $arr = ($count % 2 == 0) ? 
                               array_merge($arr, explode(' ', trim($tok))) :
                               array_merge($arr, array(trim($tok)));
    $tok = strtok('"');
    ++$count;
}

// output results
var_dump($arr);


0 commentaires

9
votes

Avec l'aide de l'utilisateur MizardX de #regex IRC Channel (irc.freenode.net) a été trouvé. Il prend même en charge les guillemets simples.

/(?:"[^"]*"|\'[^\']*\'|[^"\'\s]+)+/


4 commentaires

Qu'est-ce que \ g et \ k signifie?


\ g ancrez la correspondance à l'endroit où le match précédent s'est terminé (à peine parlant), ou au début de l'entrée s'il n'y avait pas de correspondance précédente. \ k Je devais rechercher: cela signifie "prétendre que le match a vraiment commencé ici"; Bien que la regex correspond à un jeton et à la blancheur qui suit, il agit comme celui-ci ne correspond à l'espace blanche que. Sorte de la lunette d'observation d'un pauvre homme, elle seul semble être supérieure à regarder dans la plupart des cas. Pourquoi cette fonctionnalité n'est-elle pas plus commune, je me demande? PCRE.ORG/PCRE.TXT


Merci Alan. Impossible de trouver à la fois dans Regex.info ... et il est si difficile de google pour regex.


Rien de tel que de creuser des questions de 3 ans! Bon travail en gardant cela à jour.



0
votes
$test = 'word1 word2 "this is a phrase" word3 word4 "this is a second phrase" word5';
preg_match_all( '/([^"\s]+)|("([^"]+)")/', $test, $matches);

0 commentaires