2009-12-03 6 views
-1

disons que j'ai cette chaîne ici: $string = 'hello my name is "nicholas cage"'.Fonction PHP qui sépare une chaîne en différentes chaînes?

je veux séparer les mots en chaînes de différence comme ceci:

$word1 = 'hello'; 
$word2 = 'my'; 
$word3 = 'name'; 
$word4 = 'is'; 
$word5 = 'nicholas cage'; 

Pour FHE 4 premiers mots que je peux utiliser exploser. mais comment puis-je faire avec word5? Je veux que le prénom et le nom soient une chaîne.

+0

le plus de réponses travailleraient alors qu'est-ce que vous avez besoin vraiment? – streetparade

Répondre

0

vous pourriez faire $bits = explode(' ', $string);, ce qui vous donnerait: bonjour, mon, nom, est, nicholas, cage, mais il n'y a aucun moyen de savoir que "nicholas cage" est une entité. Je ne sais pas comment faire ce que vous voulez, vous devrez peut-être croiser une base de données de dictionnaire et joindre des mots qui ne sont pas trouvés.

Edit: Je vois que vous avez maintenant cité « cage nicholas », dans ce cas, vous pouvez utiliser une expression régulière, quelque chose comme: preg_match('/([\s"])(.*?)$1/', $str, $matches);

+0

ne peux pas utiliser une autre fonction qui recherche d'abord "et puis le dernier" et l'extraire à une chaîne en quelque sorte? – fayer

0

qui est fait par l'analyse syntaxique. google "descente récursive".

+0

semble intéressant ;-) – streetparade

3

Vous pouvez utiliser cette expression régulière:

/"[^"]*"|\S+/ 

Vous pouvez l'utiliser comme ceci:

<?php 
$target = 'Hello my name is "Nicholas Cage"'; 
$pattern = '/"[^"]*"|\S+/'; 
$matches = array(); 
preg_match_all($pattern,$target,$matches); 
var_dump($matches); 
?> 
+0

jeter un oeil à ma réponse – streetparade

4

Cela peut être fait en utilisant regexp:

$string = 'hello my name is "nicholas cage"'; 
preg_match_all('/(?:"[^"]*"|\S+)/', $string, $matches); 
print_r($matches[0]); 

Il fonctionne comme suit :

  • Trouver anythinh qui correspond:
    • "[^"]*" - quoi que ce soit entre guillemets
    • \S+ - plus de 1 caractère non espace

Mais ce résultat est avec des guillemets. Retirez-les aussi:

$words = array_map('remove_starting_ending_quotes', $matches[0]); 
print_r($words); 

function remove_starting_ending_quotes($str) { 
    if (preg_match('/^"(.*)"$/', $str, $matches)) { 
     return $matches[1]; 
    } 
    else { 
     return $str; 
    } 
} 

résultat maintenant ressemble exactement comme prévu:

Array 
(
    [0] => hello 
    [1] => my 
    [2] => name 
    [3] => is 
    [4] => nicholas cage 
) 
+0

cela fonctionne pour toute version php .. mon choix –

7

Vous pouvez également utiliser la fonction de chaîne: str_getcsv si vous voulez. Appelez simplement le délimiteur "" plutôt que ",";

Exemple: $array = str_getcsv($string, " ");

+1

Nice, je +1 en 9 minutes lorsque je limite est enflée :) Shortest quantité de code, une grande réponse. J'ai testé pour être sûr, et ça fonctionne parfaitement! –

+1

fonctionne très bien si votre PHP> 5.3 –

0

cela a fonctionné pour moi

$word1 = 'hello'; 
$word2 = 'my'; 
$word3 = 'name'; 
$word4 = 'is'; 
$word5 = 'nicholas cage'; 

$my = array($word1,$word2,$word3,$word4,$word5); 


function word_split($str=array(),$words=1) { 
foreach($str as $str) 
{ 
    $arr = preg_split("/[\s]+/", $str,$words+0); 
    $arr = array_slice($arr,0,$words); 
    } 
    return join(' ',$arr); 
} 

echo word_split($my,1); 

retourne cage nicholas

Questions connexes