Je cherche à épurer un texte de ses doublons.
J'ai bien une methode qui consiste a faire un match sur les \w+ pour ensuite récrire le texte, mais je me demandais si il n'y aurait pas moyen de le faire avec un replace ...
Je cherche à épurer un texte de ses doublons.
J'ai bien une methode qui consiste a faire un match sur les \w+ pour ensuite récrire le texte, mais je me demandais si il n'y aurait pas moyen de le faire avec un replace ...
Salut,
au pif :
--- edit ---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $reg = '/(\w+) \s+ \1/x'; preg_replace ($reg, '$1', $text);
Lol, a priori ça marche, je viens de tester avec ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php $str = 'foo bar bar foo baz baz world'; $reg = '/(\w+) \s+ \1/x'; print preg_replace($reg, '$1', $str);
en fait j'en étais là:
1- j'utilise \W plutot que \s
Code : Sélectionner tout - Visualiser dans une fenêtre à part $reg = '/(\w+)\W+\1/';
je ne comprends pas tes espaces de chaque coté de \2 ??
Ce qu'il me manque souvent sont les options
tu as une liste des options de reg en php ?
c'est quoi x ?
ok je viens de trouver cette page
http://www.php.net/manual/fr/referen....modifiers.php
et donc x ignore les espaces ...
Exactement
Il faut donc utiliser le meta caractère \s pour les utiliser explicitement.
je peux pas tester là ...
mais du coup qu'en est il des apostrophes ?
\W ratisse plus large non ?
par exemple... ?d'abord et l'abord
Il me bouffe quelques caractères par ci par là en début de certains mots ...
Je ne m'explique pas pourquoi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $reg = '`(\w+) \W+ \1`xi'; $value=preg_replace ($reg, '$1 ', $value);
supporté devient upporté ...
POurrais-tu nous donnez ta chaîne de test afin que nous accordions nos violons ?
Une autre version pour prendre en compte les apostrophes et normaliser les espaces résultants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <?php $str = "foo bar bar foo baz baz tst l'o l'o world"; $reg = '/ \b([^\s]+)\b \s+ \1 \s+ /xi'; $value = preg_replace ($reg, '$1 ', $str); print ($value);
Brut de pomme par exemple un texte extrait d'un document PDF.
Un simple fichier texte quoi ... ceux que j'ai comportent des copyrigth donc j'éviterais de les copier ici mais on peut partir sur un texte de base:
Le but est d'insérer la liste des mots du texte dasn un champs de table mysql je cherche donc à virer les doublon et ensuite virer les mots de longueur inférieur à 3 caractères.Donec tincidunt tellus vitae mi convallis dictum. Praesent nec purus id quam laoreet pretium. Phasellus adipiscing sem quis magna congue nec congue nulla semper. Pellentesque a dui blandit justo adipiscing condimentum sit amet nec nunc. Donec pulvinar cursus erat non vestibulum. Vestibulum justo mi, tempus sit amet luctus ultrices, pharetra eu nibh. Curabitur facilisis tincidunt iaculis. Integer interdum malesuada ultricies! Praesent feugiat eros vitae mi aliquam tristique! Donec at lacus enim? Aenean at nunc lorem. Nunc tempor mauris id erat pharetra vulputate. Nullam interdum lobortis magna nec pharetra? Nunc nec eros in est placerat lobortis. Maecenas vitae erat posuere urna dictum ultrices. Donec rutrum aliquet ante eu malesuada. Donec id mi diam, eget venenatis urna. Cras et commodo tellus. Suspendisse nulla elit, blandit ac pharetra vitae, adipiscing id dolor. Etiam a commodo neque!
Aliquam luctus nulla fringilla justo ultrices vel fermentum libero pretium. Nulla nulla nulla, viverra at suscipit a, vulputate vitae leo. Duis sit amet augue ac dui tempus viverra. In orci dui, consectetur tempus lobortis eu; lobortis id metus? Nulla lobortis lorem eu tellus ultrices in imperdiet lorem porttitor! Nulla facilisi. Donec varius, nulla nec sollicitudin volutpat, erat mauris tempus erat, in tincidunt lacus leo quis eros. Mauris sed ante a leo commodo mollis. Praesent non eleifend lectus. Nunc non mauris non mi consequat tempus. Fusce scelerisque venenatis ante eget accumsan. Mauris id leo neque? Ut consequat tempus tortor, at tincidunt erat ultricies at. Vestibulum in nisl et ligula sagittis malesuada. Cras sit amet dolor odio. Donec quis felis tempus mauris tempor tristique ac in elit. Phasellus quis sagittis odio! Maecenas faucibus, purus sit amet vestibulum sollicitudin, sem eros consequat risus, ac sollicitudin ante urna fermentum neque! Nam ligula lorem, volutpat nec porttitor id, rhoncus in magna.
Suspendisse luctus odio sit amet eros venenatis laoreet. Morbi at urna ipsum. In aliquam; lorem vel condimentum viverra, metus metus vestibulum odio, sit amet lobortis metus dolor non nibh. Etiam volutpat risus nec dui ultrices mattis. Phasellus pretium cursus quam in tincidunt. Cras viverra lacus eu justo gravida consectetur. Nulla nec faucibus mi. In quam neque; pulvinar vel sollicitudin nec, imperdiet sed mauris? Donec in tortor non lacus gravida commodo vitae a turpis. Pellentesque arcu ante, vulputate quis aliquam quis, malesuada eu ligula. Duis eu nisi erat.
Aenean nec nisl ac ipsum consectetur ullamcorper. Mauris pharetra feugiat blandit. Sed consectetur tellus ante, eu condimentum urna? Vestibulum volutpat ultrices neque nec convallis. Cras faucibus iaculis lacinia. Aliquam convallis sem in velit interdum viverra! Etiam elementum, sem vitae adipiscing eleifend, metus lorem tincidunt ligula, vel dapibus nisi nisi ut lacus? Nam venenatis mollis magna, ac luctus massa dictum nec. Praesent condimentum tristique lorem in vulputate. Donec varius tempus quam vitae suscipit. Vivamus purus nisi, lacinia eget auctor ut, lacinia a dolor. Mauris in mi mi, quis hendrerit arcu. Nam rhoncus odio ut felis tincidunt ac tincidunt arcu ornare. Sed sed pulvinar lorem? Quisque at dui at neque dictum rutrum. Vivamus vitae enim risus, sit amet dictum orci. Cras sodales dapibus semper. Nam pretium nunc in neque pellentesque vehicula. Mauris sit amet lorem nunc; eget suscipit nisi. Duis condimentum justo eros.
Maecenas egestas nunc sit amet tellus mollis ac tristique nulla dapibus? Maecenas ultricies malesuada auctor? Maecenas auctor auctor libero sed molestie. Praesent venenatis est in urna ullamcorper lacinia in et turpis. In tincidunt dolor vel nibh scelerisque iaculis a non quam. Sed et risus arcu? Maecenas hendrerit justo ac lorem iaculis pulvinar. Nulla rhoncus dolor quis libero lacinia ut dictum ante ultricies. In hac habitasse platea dictumst. Suspendisse quis dolor in nibh viverra tincidunt quis blandit sem. Mauris sed egestas orci? Nullam blandit purus at dolor aliquet pulvinar. Aliquam eget tellus ac purus sodales aliquet ut trist
dans le dernier exemple que tu me donnes il me laisse deux foo dans le texte ...
Yep, je croyais que c'était les doublons adjacents que tu devais traiter.
Maintenant que tu as(mieux) exprimé ton besoin, il s'avère que la solution regex n'est pas forcément la plus appropriée.
Je verrais bien une piste du côté explode de la chaîne puis utilisation de array_count_values. Non ?
oui ce que je disais a depart... ^^
mais si je fais un explode sur \W, je risque de me retrouver encore avec ce souci d'accents ... ?
Pourquoi pas un preg_split('/\s+/', $str) ?
parce que je veux virer les mots de longueur inférieure à 4 caractères et les apostrophes ...
je m'arrache les cheveux !!!
que je mette \s \W ou " " dans la reg il me retourne un counte de 1 ????
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $value = file_get_contents($outpath); $regsep = '# #ix'; $value=explode($regsep, $value); echo count($value); $value=array_unique($value); $value=implode('|',$value);
J'ai ça pour l'instant :
Reste à savoir comment traiter le cas d'un mot comme "l'o'world" si tu veux virer les apostrophes. C'est un mot du genre "loworld" ou ce sont trois mots "l" "o" et "world" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php $str = "foo bar bar foo baz l'o'world baz tst foobar foobar world toto toto"; $str = preg_replace('/\b\w{1,3}\b/', '', $str); $words = preg_split('/ +/', trim($str)); print_r($words); $words = array_unique($words); print_r($words);
Autre possibilité, en fonction du besoin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php $str = "foo bar bar foo baz l'o'world baz tst foobar foobar world toto toto"; $str = preg_replace("/(?<!') \b \w{1,3} \b (?!')/x", '', $str); $words = preg_split('/ +/', trim($str)); print_r($words); $words = array_unique($words); print_r($words);
c'est mega penible !!!
avec \W il splitte sur les caractères accentués et me retourne des caractères losanges
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $reg = "#\W#"; $tab= array(); $tab=preg_split($reg, $value); $tab=array_unique($tab); $value=implode(' ',$tab);
avec[^a-zA-Zâàéèê] il ne reconnait que les ^ ???
y'a une option pour le charset je suis 100% en utf-8 !!!!
héhé suffit que je mette 100% utf8 pour que ça me saute à la figure ....
et hopu (PCRE8)
Cette option désactive les fonctionnalités additionnelles de PCRE qui ne sont pas compatibles avec Perl. Les chaînes sont traitées comme des chaînes UTF-8. Cette option est disponible en PHP 4.1.0 et plus récent sur plate-forme Unix et en PHP 4.2.3 et plus récent sur plate-forme Windows.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $reg = "#\W#u";
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager