2017-05-30 2 views
0

Tenir compte du programme suivant:En PHP comment faire str_word_count() pour reconnaître tous les caractères spéciaux UTF-8 comme mots?

<?php 
    $str='You & I = We'; 
    $arr=[]; 
    $arr=str_word_count($str,2,"&="); 
    foreach($arr as $key=>$value){ 
       echo $key.'&nbsp;&nbsp;===>&nbsp;&nbsp;'.$value.'<br>'; 
    } 
?> 

Sortie:

0 ===> You 
4 ===> & 
6 ===> I 
8 ===> = 
10 ===> We 

Considérons maintenant le programme suivant:

<?php 
    $str='You & I = We'; 
    $arr=[]; 
    $arr=str_word_count($str,2); 
    foreach($arr as $key=>$value){ 
       echo $key.'&nbsp;&nbsp;===>&nbsp;&nbsp;'.$value.'<br>'; 
    } 
?> 

Sortie:

0 ===> You 
6 ===> I 
10 ===> We 

REMARQUE:

La différence entre le 1er et 2ème fonction est en 1ère fonction troisième argument

"&="

est présent mais en 2ème fonction est pas.

En tant que telle, la première fonction reconnaît les caractères spéciaux & et = comme des mots mais pas la 2ème fonction.

Considérons maintenant une situation où notre chaîne a beaucoup, beaucoup de caractères spéciaux. Il peut devenir impossible de tous les inclure dans le troisième argument.

Voici donc ma question:

Y at-il plus simple moyen de faire fonctionner str_word_count() reconnaître tous UTF-8 caractères spéciaux comme des mots sans passer par la peine d'inclure un nombre gigantesque de caractères spéciaux dans les troisième argument?

+0

Alors peut-être faire une strpos pour trouver l'emplacement du "mot" explosé? – Andreas

+0

Comme l'a dit @Andreas. Exploser la chaîne par espace et vous aurez un joli tableau avec tous les mots, donc un mot serait en identifiant un espace entre les autres mots. Par exemple: 'Vous êtes le meilleur @ SO.', si vous faites' $ words = explode ('', $ that_string); 'et ensuite' echo count ($ words); 'vous obtiendriez' 6' des mots. Mais le dernier mot serait «SO», pas «SO». – matiaslauriti

+0

@matiaslauriti vous avez tous les deux raison. Fist Je dois utiliser exploser pour séparer tous les éléments séparés par l'espace en éléments d'un tableau, puis une boucle et strpos pour trouver la position de chaque élément du tableau dans la chaîne d'origine. Corrigez-moi si je me trompe. –

Répondre

1

Voici une façon de le faire.

https://3v4l.org/r4ngg

Comme je l'ai écrit dans les commentaires que vous pouvez utiliser et exploser strpos() pour obtenir les mots et les positions des mots.
En utilisant le troisième périmètre de strpos(), offset assure que vous n'obtenez pas la position d'un mot incorrect.
$ nextpos sera toujours la position de la fin du mot précédent, de cette façon même si vous répétez deux fois le même mot, il affichera toujours la position correcte. Vous ne pouvez pas faire exploser l'espace om.?

$str ="this is a very very long text with some words repeating over and over & over again. When you use Explode() you will get an array with all the words. & using strpos(haystack, needle, & most importantly offset) you should get a good array with the positions of the words."; 

$arrWords = explode(" ", $str); 

$nextpos = 0; 
$arrPos =array(); 
for ($i=0; $i <= count($arrWords)-1; $i++){ 

    $arrPos[$i]["Position"] = strpos($str, $arrWords[$i], $nextpos); 
    $arrPos[$i]["Lenght"] = strlen($arrWords[$i]); 
    $arrPos[$i]["Word"] = $arrWords[$i]; 
    $nextpos= $nextpos+strlen($arrWords[$i])+1; 
} 

var_dump($arrPos);