Repetition d'un mot

Mammouth du PHP | 725 Messages

03 avr. 2012, 09:53

Bonjour,

Je voudrais chercher combien de fois un mot etait repete dans une variable:
$var = 'test qui va tester l'intelligence de rimie, passe mal, un autre test';
je voudrais savoir combien de fois le mot test etait repet, normalement c'est 2 fois, sans compter "tester"

merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 avr. 2012, 10:01

substr_count devrait t'aider pas mal :)

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

03 avr. 2012, 10:11

substr_count devrait t'aider pas mal :)

@+
merci moogli,

je voudrais l'integrer dans un code BBCode, l'idee c'est de compter le nombre d'occurence dans la chaine, par exemple [bold] et voir si [/bold] a le meme resultat, sinon, on saura que:

+ Si nombre [bold] > nombre [/bold], on n a pas ferme des tags [/bold]
+ et vice versa

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 avr. 2012, 11:07

preg_replace_callback

je te conseil vivement de fouiller un peux dans la doc c'est pas compliqué
- problème de chaine => str*
- une recherche via expreg => preg_*

Après dans la liste à gauche tu fouille et regarde la description des fonctions, tu va apprendre plein de truc :)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

03 avr. 2012, 15:08

ca marche pas :(
<?php

final class BBCode {

public final function __construct($text) {
		
		$this->text = $text;
		
		}
		
		
function bbcode()
{
	
	   $tags = array(
	   '/\[b\](.*?)\[\/b\]/isU' => '<b>\\1</b>',
	   '/\[i\](.*?)\[\/i\]/isU' => '<i>\\1</i>',
	   '/\[u\](.*?)\[\/u\]/isU' => '<u>\\1</u>',
	   
	   ); // closed array 
 	  
 	     
	   foreach($tags as $k=>$v)
	   {
	  		$this->newText = preg_replace($k, $v , $this->text);
	   }
	   
	   return($this->newText);
} // end function


	function parse()
	{
		$this->newText2 = preg_replace_callback(
					'/\[.*\](.*?)\[\/.*\]/isU',
					array(&$this, "bbcode"),
					$this->newText);
					
					return $this->newText2;
	}

} // end class


$f = new BBCode('Ceci est un [b]test GRAS[/b], et ceci est un autre [b]test gras[/b]');

echo $f->bbcode();

echo '<br />';

echo $f->parse();
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 avr. 2012, 15:32

ca marche pas :(
ça c'est comme quand tu dit Gmalade au docteur => ça l'aide pas :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

il faut indiquer des symptômes, indiquer les tests etc etc

il faut que tu créer une méthode pour ce traitement précis !!!!


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

03 avr. 2012, 16:30

voila le resultat:

Ceci est un Ceci est un [-b]test GRAS[-/b], et ceci est un autre [-b]test gras[-/b]

j'ai mis (-) pour ne pas etre prise en consideration sur le forum

Mammouth du PHP | 2278 Messages

03 avr. 2012, 20:38

De toute façon, cette forme d'analyse est mal conçue comme je vais le prouver:
c'est censé être gras puis maigre puis gras puis normal

Code : Tout sélectionner

c'est censé être [b]gras puis maigre puis [b]gras[/b][/b] puis normal
Il faut se pencher sur les moteurs d'analyse syntaxique pour espérer une approche saine du problème.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 725 Messages

04 avr. 2012, 02:16

d ou vient le probleme dans mon code?

Mammouth du PHP | 725 Messages

04 avr. 2012, 04:38

voila un autre essai, seul le soulignement qui marche :(
<?php

final class BBCode {

public final function __construct($text) {
		
		$this->text = $text;
		
		}
		
		
function bbcode()
{
	
	   $tags = array(
	   '\[b\](.*?)\[\/b\]' => '<strong>$1</strong>',
	   '\[i\](.*?)\[\/i\]' => '<em>$1</em>',
	   '\[u\](.*?)\[\/u\]' => '<u>$1</u>',
	   
	   ); // closed array 
 	  
 	  
 	  $this->tags = $tags;
 	     
	   foreach($this->tags as $k=>$v)
	   {
	  		$this->newText = preg_replace('/'.$k.'/', $v , $this->text);
	  		//echo $this->newText.'<br />';
	   }
	   
	   return($this->newText);
} // end function

} // end class


$f = new BBCode('Ceci est un [b]test GRAS[/b] et bien [u]souligne[/u], et ceci est un autre [b]test gras[/b] et voila [i]italic[/i]<br />');

echo $f->bbcode();

echo '<br />';

//echo $f->parse();
?>

ViPHP
xTG
ViPHP | 7331 Messages

04 avr. 2012, 07:19

C'est normal.
foreach($array as $val)
  $b = $val;
Quelle est la valeur de $b à la fin ? La dernière valeur de $array.

Mammouth du PHP | 725 Messages

04 avr. 2012, 08:13

c'est u:
           '\[u\](.*?)\[\/u\]' => '<u>$1</u>',

Mammouth du PHP | 2278 Messages

04 avr. 2012, 16:37

De toute façon, cette forme d'analyse est mal conçue comme je vais le prouver:
c'est censé être gras puis maigre puis gras puis normal

Code : Tout sélectionner

c'est censé être [b]gras puis maigre puis [b]gras[/b][/b] puis normal
Il faut se pencher sur les moteurs d'analyse syntaxique pour espérer une approche saine du problème.
Il ne suffit pas de compter si on a le même nombre d'ouvrants et de fermants pour que le problème soit résolu:
((a +b) /c) : deux ( et deux )
n'a pas grand chose à voir avec
(a +(b /c)) : deux ( et deux )
ou a + (b/c) avec (a+b) /c
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 725 Messages

05 avr. 2012, 04:22

oui c'est vrai, comment resoudre en primo le probleme qu'un seul parametre est pris en consideration

Mammouth du PHP | 2278 Messages

05 avr. 2012, 09:11

sous unix, il y a bison (linux de yacc) et flex qui font ce type d'analyse, mais il faut écrire une grammaire sous forme d'expressions réguliéres
http://flex.sourceforge.net
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD