Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/05/2007, 13h18   #1
Membre expérimenté
 
Inscription : janvier 2007
Messages : 622
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 622
Points : 555
Points : 555
Par défaut Eliminer les balise gras et italique

Bonjour,

J'ai dans ma base de données des textes qui contiennet des balises de gras et d'italique que je désire éliminer pour les faire passer en RSS.

$xml2 = "<i>«Il est <b>juste que ce qui est juste soit suivi</b>, il est nécessaire que ce qui est le plus fort soit suivi. La justice sans la force est impuissante, la force sans la justice est tyrannique. La justice sans force est contredite parce qu’il y a toujours des méchants. La force sans la justice est accusée. Il faut donc mettre ensemble la justice et la force, et pour cela, faire que ce qui est juste soit fort, ou que ce qui est fort soit juste.»</i> Pascal";

Je me suis démelé avec les expressions régulières mais je n'ai pas trouvé mon bonheur.

Code :
$xml2 = preg_replace('/<(i|b)[^>]*>(.*?)<\/(i|b)>/i', '$2', $xml2);
Cette ligne me permet de "débaliser" mon texte mais pas si elles sont imbriquées. Une aide serait bienvenue. Merci
kabkab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2007, 13h38   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 827
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 827
Points : 3 459
Points : 3 459
strip_tags( ) ne te convient pas ?
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2007, 14h06   #3
Membre expérimenté
 
Inscription : janvier 2007
Messages : 622
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 622
Points : 555
Points : 555
Merci de la réponse rapide.

Le problème avec strip_tags que je viens de découvrir (merci) est que je traite mon résultat xml (rss) avant de l'enregistrer dans mon fichier (il n'y a pas moyen de le faire avant) et ça m'enlève tous mes tags html. Ce qui m'intéresse, c'est uniquement <I> et <B>. C'est pour cela que je me suis orienté vers les expressions régulières.

Merci encore.
kabkab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2007, 14h45   #4
Membre éclairé
 
Avatar de genova
 
Inscription : septembre 2004
Messages : 487
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 487
Points : 397
Points : 397
Envoyer un message via MSN à genova
Essaie avec
Code :
$xml2 = preg_replace('/<(i|b)[^>]*>(.*?)<\/(i|b)>/si', '$2', $xml2);
__________________
Testez le forum Fire Soft Board, un forum libre, gratuit et français.

Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.
genova est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2007, 15h47   #5
Membre expérimenté
 
Inscription : janvier 2007
Messages : 622
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 622
Points : 555
Points : 555
Merci de l'effort mais ne fonctionne toujours pas. Les balises imbriquées ne sont pas prise en compte.

Mais :
Code :
1
2
$xml2 = preg_replace('/<(i)[^>]*>(.*?)<\/(i)>/i', '$2', $xml2);
$xml2 = preg_replace('/<(b)[^>]*>(.*?)<\/(b)>/i', '$2', $xml2);
fonctionne. Le petit hic, c'est que si j'avais une douzaine de type de balises à éliminer...?

Merci.
kabkab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2007, 17h01   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
  • Je doute que l'imbrication de vos balises soient respectées
  • Les parenthèses capturantes dans vos différents motifs autour de b et i sont inutiles car non réutilisées
  • Choisissez un délimiteur qui n'apparaît pas, de sorte à ne pas avoir à l'échapper
Théoriquement et pour répondre à votre dernière question, vous pourriez transformer votre expression de la sorte :
Code :
$xml2 = preg_replace('#<([ib])[^>]*>(.*?)</\1>#si', '\2', $xml2);
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 15h30   #7
Invité régulier
 
Inscription : juin 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 15
Points : 8
Points : 8
Bonjour,

La dernière expression régulière posté ne fonctionnera pas dans ce cas :

exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
preg_match('#<([ib])[^>]*>(.*?)</\1>#si',
'<i>test<i>imbriqué</i></i>'
,$matches, PREG_OFFSET_CAPTURE);
 
print_r($matches );
 
Array
(
    [0] => Array
        (
            [0] => <i>test<i>imb</i>
            [1] => 0
        )
 
    [1] => Array
        (
            [0] => i
            [1] => 1
        )
 
    [2] => Array
        (
            [0] => test<i>imb
            [1] => 3
        )
)
Je souhaiterai parser du html et récupérer le contenu situé entre 2 balises (par exemple 2 span) mais en gérant les balises imbriqués. A l'instar du cas précèdent, si j'ai <span>test<span>contenu imbriqué</span></span>, je souhaite récupéré test<span>contenu imbriqué</span>.
Mais attention, dans le cas suivant <span>test1</span><span>test2</span>, je dois récupéré en premier <span>test1</span>, puis <span>test2</span> et non pas test1</span><span>test2

Bref gérer l'imbrication intelligemment
J'ai essayé de tout les côtés mais pas encore réussi (d'ailleurs, est-ce possible ?)

Merci de votre aide
ToYonos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2007, 11h38   #8
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
En fait, c'est le même probleme que le jeu des parentheses. Il te faut un langage à pile, les regex ne suffiront pas.
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2007, 12h34   #9
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
J'ai reussi à te pondre un ptit truc :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
 
$xml = '<i>test<i>imbriqué</i></i><b><i>ffdkl</i><b>jfkdsjfds</b></b>';
 
function langage_pile($xml)
{
	$pile = array();
	$return = array();
	$last = -1;
 
	preg_match_all('#</?([ib])>#', $xml, $matches, PREG_OFFSET_CAPTURE + PREG_SET_ORDER);
 
	foreach($matches as $match)
	{
		// On test si c'est une balise ouvrante ou fermante
		if( strpos($match[0][0], '/') === FALSE )
		{
			// Ouvrante
			$pile[++$last] = $match;
		}
		else
		{
			// On vérifie mais si le code xml est valide, on ne rentre jamais ici
			if( $pile[$last][1][0] != $match[1][0] )
			{
				var_export($pile[$last]);
				die('ERROR');
			}
			else
			{
				if( count($pile) == 1 )
				{
					// On ajoute ce contenu au texte de sortie
					$return[] = substr($xml, $pile[$last][0][1] + strlen($pile[$last][0][0]), $match[0][1]-($pile[$last][0][1] + strlen($pile[$last][0][0])));
				}
 
				// On supprime la derniere entrée de $pile
				unset($pile[$last--]);
			}
		}
	}
 
	return $return;
}	
 
var_export( langage_pile($xml) );
 
?>
Normalement ça fonctionne
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 10h06   #10
Invité régulier
 
Inscription : juin 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 15
Points : 8
Points : 8
Merci pour ta réponse !

En fait, j'avais déja fais quelque chose mais sans regexp (uniquement à base de strpos, etc...) Ca marche mais c'est fastidieux.

J'ai voulu migré mon code avec uniquement des regexp mais ce n'est à priori donc pas possible.

Je vais donc, en m'inspirant de ton exemple, faire une solution mixte avec des regexp et du code pour la pile
ToYonos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h48.


 
 
 
 
Partenaires

Hébergement Web