[PHP] La plus grande suite d'un caractère

Fermé
sp00m` - 10 juil. 2009 à 21:00
 sp00m` - 11 juil. 2009 à 19:32
Bonjour,

J'ai un petit défi d'algorithmique (en PHP) pour les plus coriaces ^^

Pour de l'URL RW, je transforme des chaines de caractères en filtrant les caractères qui mettront le bazar dans les URLs. Par exemple, je remplace tous les caractères accentués par leur équivalent sans accent, et je remplace tout ce qui est espaces, apostrophes, etc. par des tirets. Sauf qu'au final, il peut y avoir plusieurs tirets qui se suivent.

Voila donc le défi : à chaque fois qu'il y a une suite de tirets dans une chaine de caractères, il faut la remplacer par un seul tiret ! J'ai déjà testé avec des for, des while, des if, des preg_match, des strlen et des str_replace, mais j'ai pas encore trouvé ZE solution ^^

Merci de votre aide, je m'arrache les cheveux là-dessus depuis quelques jours !

Code de base :
function getFiltered()
{
	$this->data = htmlentities($this->data, ENT_NOQUOTES, 'utf-8');
	$this->data = preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $this->data);
	$this->data = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $this->data);
	$this->data = preg_replace('#\&[^;]+\;#', '', $this->data);
	$in = array('?', '!', '.', '...', ',', '_', ';', ':', '/', ' ', '"', '"', '(', ')');
	$out = array('-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-');
	$this->data = str_replace($in, $out, $this->data);
	// C'est ici qu'il faudrait trouver le ptit script magique ^^
	$this->data = stripslashes($this->data);
	$this->data = strtolower($this->data);
	return $this->data;
}
A voir également:

6 réponses

jeangilles Messages postés 816 Date d'inscription samedi 21 juin 2008 Statut Membre Dernière intervention 17 juillet 2012 186
10 juil. 2009 à 22:07
heu ...

$this->data = preg_replace('#(-)+#', '-', $this->data);

ca marche pas ?
0
Salut,

Au pire tu peut toujours parcourir ta chaine de caractère en testant si le caractère en cours est un "-" tu teste le caractère suivant si c'est un "-" aussi tu supprime le caractère en cours. Comme ça, ça devrait marcher même s'il y a 3 "-" ou plus qui se suivent.

Bon courage!!
++
0
Merci de vos réponse!

Pour jeangilles, ta proposition ne fonctionnait pas : ça me mettait des tirets entre chacun des caractères de la chaine.

Pour sith, j'ai cherché dans ton sens et j'ai trouvé une solution qui fonctionne! Mais c'est un peu lourd quoi je pense. Si quelqu'un a une solution plus optimale, je suis preneur ^^

En attendant, voilà avec quoi je vais fonctionner :

function Filter()
{
	$this->data = htmlentities($this->data, ENT_NOQUOTES, 'utf-8');
	$this->data = preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $this->data);
	$this->data = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $this->data);
	$this->data = preg_replace('#\&[^;]+\;#', '', $this->data);
	$in = array('?', '!', '.', ',', '_', ';', ':', '/', ' ', '"', "'", '(', ')');
	$out = array('-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-');
	$this->data = str_replace($in, $out, $this->data);
	$delete = array();
	for($i=0; $i<strlen($this->data); $i++)
	{
		if($this->data[$i] == '-' && $this->data[$i+1] == $this->data[$i])
		{
			$delete[] = $i+1;
		}
	}
	foreach($delete as $value)
	{
		$this->data[$value] = ' ';
	}
	$this->data = str_replace(' ', '', $this->data);
	if($this->data[strlen($this->data)-1] == '-')
	{
		$this->data[strlen($this->data)-1] = ' ';
	}
	if($this->data[0] == '-')
	{
		$this->data[0] = ' ';
	}
	$this->data = str_replace(' ', '', $this->data);
	$this->data = strtolower($this->data);
	return $this->data;
}


Encore merci ^^
0
jeangilles Messages postés 816 Date d'inscription samedi 21 juin 2008 Statut Membre Dernière intervention 17 juillet 2012 186
11 juil. 2009 à 16:55
ha oui dsl javais du faire une ptite erreur
mais ce que tu veux cest bien remplacer plusieurs tirets par un seul quand c'est le cas ?
si oui, ca ca marche parce que je l'ai testé avant de poster cette fois ci XD

$chainefinale = eregi_replace("[-]+", "-", $chaine_a_traiter);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
j'allais justement proposer la même fonction que je venais de trouver ici:
http://www.illogeek.fr/php/supprimer-plusieurs-occurences-dun-caractere-dans-une-chaine-avec-php/50/
mais jeanGilles a été plus rapide que moi!!

enfin normalement ça devrait marcher maintenant...

++
0
Parfait !

Je pense qu'on ne peut pas faire mieux !

Voila ce que ça donne, servez-vous si vous en avez besoin :
function Filter()
{
	$this->data = htmlentities($this->data, ENT_NOQUOTES, 'utf-8');
	$this->data = preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $this->data);
	$this->data = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $this->data);
	$this->data = preg_replace('#\&[^;]+\;#', '', $this->data);
	$in = array('?', '!', '.', ',', '_', ';', ':', '/', ' ', '"', "'", '(', ')', '[', ']', '{', '}', '=', '#', '|', '@', '*', '^');
	$out = array('-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-');
	$this->data = str_replace($in, $out, $this->data);
	$this->data = stripslashes($this->data);
	$this->data = eregi_replace("[-]+", "-", $this->data);
	if($this->data[strlen($this->data)-1] == '-')
	{
		$this->data = substr($this->data, 0, -1);
	}
	if($this->data[0] == '-')
	{
		$this->data = substr($this->data, 1);
	}
	$this->data = strtolower($this->data);
	return $this->data;
}
0