Vérification et correction regex svp

Eléphant du PHP | 418 Messages

10 févr. 2012, 05:01

Salutation à tous

Voici mon soucis

J'ai cette regex dans un preg_match
!preg_match("/^[\w-\W\s]+[^\/\\\<>]$/",$titre)
En fait j’aimerais autoriser touts les caractères, les espaces et interdire le \ le / le < et le >

Pourriez vous me dire svp, si cette dernière est correct, et sinon comment l'agenceriez vous?

C'est pour un titre de sujet, si vous souhaitez connaitre l'utilisation finale de cette dernière.

Merci de votre aide


Cordialement

Eléphant du PHP | 418 Messages

10 févr. 2012, 06:27

Problème aussi avec les regex qui me permette de transformer un "codetexte" en html à l'instar du bbcode

En effet, on peux, comme sur ce forum, citer des citations, et on affiche normalement un cadre de citation pour chacune d'elles.

voici ma regex actuelle
$content = preg_replace('`<citation nom="(.+)">(.+)<\/citation>`isU', '<span class="citation">Citation : <a href="./index.php?r=voirprofile&name=$1">$1</a></span><div class="citation2">$2</div>', $content);
Cela fonctionne dans une fonction (prise sur le tutoriel du site du zéro)

Et lorsque je fait une citation, on à pas de soucis avec, mais si je cite cette dernière, on n'en affiche qu'une seule.

Image

Je devrais avoir deux cadres de citation comme sur cette image:

Image

J’espère que vous aurez compris mon soucis (enfin mes avec celui du dessus ^^)

Merci de votre aide

Cordialement

ViPHP
ViPHP | 2287 Messages

10 févr. 2012, 19:04

!preg_match("/^[\w-\W\s]+[^\/\\\<>]$/",$titre)
En fait j’aimerais autoriser touts les caractères, les espaces et interdire le \ le / le < et le >
Salut,

Comme tu as dû le voir, non, ta regexp n'est pas bonne (ou au moins n'exprime pas exactement ton idée). Pour exprimer le "tout sauf quelques caractères" tu peux te contenter de spécifier ce qui est interdit (puisque la regexp est bornée à gauche et à droite par ^ et $), comme ceci :
!preg_match('@^[^/\\<>]+$@',$titre)
Si tu veux autoriser qu'un $titre vide valide la regexp, tu peux modifier le + final en *.

@+
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 2287 Messages

10 févr. 2012, 19:09

Problème aussi avec les regex qui me permette de transformer un "codetexte" en html à l'instar du bbcode

En effet, on peux, comme sur ce forum, citer des citations, et on affiche normalement un cadre de citation pour chacune d'elles.

voici ma regex actuelle
$content = preg_replace('`<citation nom="(.+)">(.+)<\/citation>`isU', '<span class="citation">Citation : <a href="./index.php?r=voirprofile&name=$1">$1</a></span><div class="citation2">$2</div>', $content);
Pour ta seconde regexp, essaye d'enlever le modifieur "U", ça peut peut-être le faire :)

http://fr2.php.net/manual/fr/reference. ... ifiers.php
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 418 Messages

10 févr. 2012, 19:35

Eu on peux dire qu'il y a de l'avancement ^^

Le hic c'est que ce coup si, il prend pas la première, met le teste dans les couleurs ou effets de textes Oo.

Voici un screen (attention aux yeux ^^)
Image

Eu je joint mon code complet, ça devrais un peu mieux aider. (j'ai remit le U en fin d'index sur la citation avec le nom!!)
<?php
function parseZCode($content) {
	// Parsage des balises
	$zcode = array(  
		'`<gras>(.+)<\/gras>`isU',  
		'`<italique>(.+)<\/italique>`isU',
		'`<souligne>(.+)<\/souligne>`isU',
		'`<lien>(.+)<\/lien>`isU',
		'`<lien url="(.+)">(.+)<\/lien>`isU',
		'`<image>(.+)<\/image>`isU',
		'`<citation nom="(.+)">(.+)<\/citation>`isU',
		'`<citation>(.+)<\/citation>/g`isU',
		'`<code>(.+)<\/code>`isU',
		'`<code type="(.+)">(.+)<\/code>`isU',
		'`<secret>(.+)<\/secret>`isU',
		'`<taille valeur="(.+)">(.+)</taille>`isU',
		'`<couleur nom="(.+)">(.+)<\/couleur>`isU',
		'`<police nom="(.+)">(.+)<\/police>`isU',
		'`<br \/>`isU'
	);  
	
	$html = array(  
		'<b>$1</b>',  
		'<i>$1</i>',
		'<u>$1</u>', 
		'<a href="$1">$1</a>',
		'<a href="$1" title="$2">$2</a>',
		'<img src="$1" alt="Image" />',
		'<span class="citation">Citation : <a href="./index.php?r=voirprofile&name=$1">$1</a></span><div class="citation2">$2</div>',
		'<span class="citation">Citation :</span><div class="citation2">$1</div>',
		'<span class="code">Code : </span><div class="code2">$1</div>',
		'<span class="code">Code $1: </span><div class="code2">$2</div>',
		'<span class="spoiler">Secret <a href="#" onclick="switch_spoiler_hidden(this); return false;">(cliquez pour afficher)</a></span><div class="spoiler2" return false;"><div class="spoiler3">$1</div></div></span>',
		'<span class="$1">$2</span>',
		'<span class="$1">$2</span>',
		'<span class="$1">$2</span>',
		''
	);
	// $content = htmlspecialchars_decode($content);	
	$content = htmlspecialchars($content);	
	$content = preg_replace($zcode, $html, $content);
	
	// parsage des smilies
	$smiliesName = array(':magicien:', ':colere:', ':diable:', ':ange:', ':ninja:', '>_<', ':pirate:', ':zorro:', ':honte:', ':soleil:', ':snif:', ':waw:', ':\\)', ':D', ';\\)', ':p', ':lol:', ':euh:', ':\\(', ':o', ':colere2:', 'o_O', '\\^\\^', ':\\-°');
	$smiliesUrl  = array('magicien.png', 'angry.gif', 'diable.png', 'ange.png', 'ninja.png', 'pinch.png', 'pirate.png', 'zorro.png', 'rouge.png', 'soleil.png', 'snif.png', 'waw.png', 'smile.png', 'heureux.png', 'clin.png', 'langue.png', 'rire.gif', 'unsure.gif', 'triste.png', 'huh.png', 'mechant.png', 'blink.gif', 'hihi.png', 'siffle.png');
	$smiliesPath = "images/smilies/";
	
	for ($i = 0, $c = count($smiliesName); $i < $c; $i++) {
		$content = preg_replace('`' . $smiliesName[$i] . '`isU', '<img src="' . $smiliesPath . $smiliesUrl[$i] . '" alt="smiley" />', $content);
	}
	
	// Rtours &agrave; la ligne
	$content = nl2br($content);
	
	return $content;
}
?>

Eléphant du PHP | 418 Messages

10 févr. 2012, 19:45

Pour la regex titre, le problème persiste au niveau du \

Je suis obliger de mettre 3\ (\\\)

Voici la version tel que tu me la définit:
if (!empty($titre) && (!preg_match("@^[^/\\<>]+$@",$titre)))
celle que je dois faire pour prendre en compte le \
if (!empty($titre) && (!preg_match("@^[^/\\\<>]+$@",$titre)))
Est ce normale de mettre \\\ ?

ViPHP
ViPHP | 2287 Messages

10 févr. 2012, 20:02

Ok, après quelques tests preg_replace ne réagit pas bien quand les motifs sont imbriqués entre eux (ce qui fait de ton tag citation un cas particulier).
<?php 
echo preg_replace('`<citation>(.+)</citation>`isU','[**$1**]','<citation>hey<citation>ca marche</citation> cool</citation>'); // [**hey<citation>ca marche**] cool</citation>
echo preg_replace('`<citation>(.+)</citation>`is','[**$1**]','<citation>hey<citation>ca marche</citation> cool</citation>'); // [**hey<citation>ca marche</citation> cool**]
Comme tu le vois, sans le U ça marche au moins pour le premier niveau. Avec le U ça te sort juste de la bouillie (le tag lundi qui est associé au tag mardi... #-o ), on est donc plus loin du résultat.

La solution serait, tout en enlevant ce U, d'appeler plusieurs fois preg_replace pour les citations, pour gérer tous les niveaux de remplacements. Ce ne serait pas raisonnable d'appeler la fonction 100 fois de suite donc il va falloir fixer un maximum. :wink:

Pour comparaison, sur phpfrance on est limité à trois niveaux de citations (je ne peux pas citer un message qui cite un message qui cite un message qui cite un message), j'imagine pour la même raison que ton souci (ne pas trop faire d'appels à cette regexp, pour un résultat visuel qui serait de toute façon peu lisible : qui peut encore lire une conversation après 5 niveaux de citation ?).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 418 Messages

10 févr. 2012, 20:58

Oui tu as raison, 3 c vraiment correct, après tu te perd rien qu'en essayant de lire les citations ^^

Comment, dans ma fonction, je dois déclarer 3 fois la même regexp, et surtout, comment, dans ma page reponse.php, puis je interdire plus de 3 citations?

Merci de ton aide

Cordialement

ViPHP
ViPHP | 2287 Messages

10 févr. 2012, 21:27

Pour la regex titre, le problème persiste au niveau du \

Je suis obliger de mettre 3\ (\\\)

Voici la version tel que tu me la définit:
if (!empty($titre) && (!preg_match("@^[^/\\<>]+$@",$titre)))
celle que je dois faire pour prendre en compte le \
if (!empty($titre) && (!preg_match("@^[^/\\\<>]+$@",$titre)))
Est ce normale de mettre \\\ ?
Il y a une différence entre le code que je t'ai mis dans le post plus haut et le code que tu as noté. Une différence que tu n'as pas vue, et qui permet de se passer d'un \ :) (un indice sous forme d'un lien : http://www.php.net/manual/fr/language.t ... tax.single )

Sinon, dans le cas particulier de cette regexp, oui les 3 \ sont normaux si tu utilises des doubles quotes ("..."), c'est juste ni clair, ni pratique, ni joli à mon goût. A toi de voir :P
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 418 Messages

10 févr. 2012, 21:35

Lol j'oublie tout le temps que en fonction des " et ' on à une différence majeur selon ce que l'on en fait Oo

Faut pas oublier, le moindre détail à une grande importance ^^

Merci pour ça, ce problème est résolut, reste le problème des regex citation #-o

Un super merci à toi pour ton aide, et tout ceux qui prenne du temps pour aider les autres

ViPHP
ViPHP | 2287 Messages

10 févr. 2012, 21:42

Pas de quoi, si tu as appris quelquechose au passage alors c'est cool :)

Pour les citations, le plus simple serait d'enchaîner 3 fois la même regexp dans l'array (comme tu l'as toi-même suggéré d'ailleurs) et voir si ça marche. Avec un peu de chance, ça devrait. Si ça ne marche pas, il faudra isoler cette regexp (en fait les deux, une pour la citation basique et une autre pour la citation avec nom) pour l'appliquer 3 fois de suite indépendamment des autres (puisque c'est la seule du groupe qui est récursive).

Essaye de ton côté de le faire, si tu ne t'en sors pas je repasserai voir un peu plus tard.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 418 Messages

10 févr. 2012, 21:48

J'ai copié trois fois la rexexp, pas de soucis ça fonctionne.

Par contre j'ai laisser le U et il n'y a pas de soucis.

La question, c'est comment interdire les citation de plus de trois niveaux si c'est possible, sinon, bin les citations ne seront pas citées Oo

Merci en tout cas

Cordialement

ViPHP
ViPHP | 2287 Messages

10 févr. 2012, 21:56

La question, c'est comment interdire les citation de plus de trois niveaux si c'est possible, sinon, bin les citations ne seront pas citées Oo
Pour bien faire, il va te falloir une nouvelle regexp pour ça. (un simple compteur d'occurences ne va pas suffire, car tu auras du mal à distinguer le cas d'un post avec 4 citations simples du cas d'un post avec une citation sur 4 niveaux).

Après tout ça, je te sens chaud pour la faire toi-même, cette regexp :langue:
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 2287 Messages

10 févr. 2012, 22:43

Pour bien faire, il va te falloir une nouvelle regexp pour ça. (un simple compteur d'occurences ne va pas suffire, car tu auras du mal à distinguer le cas d'un post avec 4 citations simples du cas d'un post avec une citation sur 4 niveaux).
En y repensant ce serait aussi faisable avec un compteur en fait (si on parcourt tout le post, on fait +1 pour une ouverture de citation, -1 pour une fermeture, et on arrête et affiche une erreur si on dépasse 3).

As-tu commencé ? Quelle approche préfères-tu ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 418 Messages

10 févr. 2012, 23:56

J'ai pas vraiment commencer, mais le compteur risque d'interdire les citations différentes non?

Je ne vois pas trop comment faire.

Peux tu me mettre sur la voie si tu vois comment faire?

Merci

Cordialement