8796 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,

Je souhaiterais créer un motif en expression régulière à partir du début et de la fin d'une chaîne. Voici le code (la chaîne) en question :
$smilies = array(
	':)' => 'smile.png',
	'=)' => 'smile.png',
	':|' => 'neutral.png',
	'=|' => 'neutral.png',
	' [decu]' => 'sad.png',
	'=(' => 'sad.png',
	':D' => 'big_smile.png',
	'=D' => 'big_smile.png',
	':o' => 'yikes.png',
	':O' => 'yikes.png',
	';)' => 'wink.png',
	':/' => 'hmm.png',
	' [langue]' => 'tongue.png',
	':p' => 'tongue.png',
	':lol:' => 'lol.png',
	':mad:' => 'mad.png',
	':rolleyes:' => 'roll.png',
	':cool:' => 'cool.png');

Voici ce que j'avais créé comme motif pour retrouver le code ci-dessus (ça ne marche pas) :
/^(\$smilies = array).*(cool.png'\);)$/

Mon cheminement : je recherche une chaîne commençant par ce qui est entre parenthèse, se terminant par ce qui est dans la deuxième parenthèse. Le ".*" correspond à un nombre de caractères indéfinis.
Je dos faire fausse route...

Merci d'avance pour votre coup de pouce Smiley cligne
Modifié par jojaba (02 Oct 2010 - 10:58)
Salut,

Il faut utiliser l'option s.
PHP a écrit :
s (PCRE_DOTALL)
Avec cette option, le métacaractère point (.) remplace n'importe quel caractère, y compris les nouvelles lignes. Sans cette option, le caractère point ne remplace pas les nouvelles lignes.

Source : options disponibles pour les expressions rationnelles


L'expression ci-dessous effectue aussi une recherche insensible à la casse (option i activée).
/^\$smilies\s*=\s*array\((.*)\);$/si
Modérateur
Eric2A a écrit :
Salut,

Il faut utiliser l'option s.


L'expression ci-dessous effectue aussi une recherche insensible à la casse (option i activée).
/^\$smilies\s*=\s*array\((.*)\);$/si

Merci Eric pour cette réponse Smiley smile
Je vais aller tester ton expression. Comment fait le moteur pour savoir quel est le bout au début et celui de la fin ? J'arrive pas à comprendre ça, c'est pour ça que j'ai mis des parenthèses...
Modérateur
J'ai testé, ça ne marche pas hélas !! Peut-être que mon code n'est pas bon !
Voici le fragment :

$file_content = file_get_contents(PUN_ROOT.'include/parser.php');
	if (strpos($file_content, 'ezbbc') === false) {
	        //Inserting the EZBBC code by replacing several existing lines
	        $search = array(
	               "/^\$smilies\s*=\s*array\((.*)\);$/si",
	               // "/^\$text(.*)\/img\/smilies\/(.*)\$text);$/si"
	                );
	        $replacement = array (
	                "require PUN_ROOT.'plugins/ezbbc/ezbbc_smilies1.php';",
	               // "require PUN_ROOT.'plugins/ezbbc/ezbbc_smilies2.php';"
	                 );
	        $new_file_content = preg_replace ($search, $replacement, $file_content);
	        $fp = fopen (PUN_ROOT.'include/parser.php', 'wb');
	        fwrite ($fp, $new_file_content);
	        fclose ($fp);
	        
	}

J'ai commenté le deuxième élément de tableau qui ne fonctionne pas non plus Smiley decu
Modifié par jojaba (01 Oct 2010 - 19:43)
En fait, tu désires remplacer la déclaration du tableau $smilies
$smilies = array(...);

par la ligne
require PUN_ROOT.'plugins/ezbbc/ezbbc_smilies1.php';

Où le fichier à inclure contient entre autres sa propre déclaration. C'est bien ça ?

Dans ce cas :

a) Puisque la chaine recherchée n'est en fait qu'une portion de chaine...
Les ancrages ^ et $ marquant respectivement le début et la fin de la chaine n'ont plus lieu d'être utilisées.

b) Puisque tout le contenu doit être remplacer...
Il n'est plus utile de capturer ce qui se trouve entre $smilies = array( et );.

c) Afin d'éviter la corruption du fichier...
Le quantificateur (?) a été ajouté. Ainsi le moteur s'arrête à la première parenthèse fermante trouvée.
$file_content = file_get_contents(PUN_ROOT.'include/parser.php');
if (strpos($file_content, 'ezbbc') === false) {
	//Inserting the EZBBC code by replacing several existing lines
	$search='/\$smilies\s*=\s*array\(.*?\);/si';
	$replacement="require PUN_ROOT.'plugins/ezbbc/ezbbc_smilies1.php';";
	$new_file_content = preg_replace ($search, $replacement, $file_content);
	$fp = fopen (PUN_ROOT.'include/parser.php', 'wb');
	fwrite ($fp, $new_file_content);
	fclose ($fp);                  
}

Edit : Fais un backup du fichier parser.php avant.
Modifié par Eric2A (02 Oct 2010 - 02:07)
Modérateur
Eric2A a écrit :
En fait, tu désires remplacer la déclaration du tableau $smilies
$smilies = array(...);

par la ligne
require PUN_ROOT.'plugins/ezbbc/ezbbc_smilies1.php';

Où le fichier à inclure contient entre autres sa propre déclaration. C'est bien ça ?

C'est ça, oui Smiley smile
a écrit :

Edit : Fais un backup du fichier parser.php avant.

Oui, oui, j'ai fait Smiley cligne

Par contre, ça ne marche toujours pas. Le tableau n'est toujours pas remplacé par ma ligne d'inclusion ! Pourtant, d'après mon éditeur de texte, le fichier parser.php est bien modifié, ceci dit, il détecte dans ce cas, le fait qu'on réécrit tout le contenu du fichier après remplacements (qui n'ont pas eu lieu)...
Modifié par jojaba (01 Oct 2010 - 22:49)
Le code contenait 2 erreurs (je l'ai édité) :

1) Le $ manquant pour la variable file_content.
2) La virgule terminant la ligne $search=... au lieu du point-virgule.

Mais je présume que tu avais porté les modifications pour ton test.

J'ai testé en ligne avec le fichier parser.php provenant de FluxBB 1.4.2...
La lecture du fichier avec notepad++ me confirme que la modification s'est bien déroulée.
Modérateur
Eric2A a écrit :
Le code contenait 2 erreurs (je l'ai édité) :

1) Le $ manquant pour la variable file_content.
2) La virgule terminant la ligne $search=... au lieu du point-virgule.

Mais je présume que tu avais porté les modifications pour ton test.

Je n'avais copié que le motif dans le code que tu proposais...
a écrit :

J'ai testé en ligne avec le fichier parser.php provenant de FluxBB 1.4.2...
La lecture du fichier avec notepad++ me confirme que la modification s'est bien déroulée.

Et le remplacement a été effectué ? (moi j'utilise jEdit Smiley langue )
J'ai déjà fait fonctionner le remplacement en utilisant la fonction str_replace(), le défaut étant que si la chaîne comporte une tabulation ou un espace en moins, elle n'est pas reconnue, c'est pour cela que je souhaitais passer aux regexp, elles permettent d'être plus "souple" dans la reconnaissance...
Je me demande si ça n'est pas dû aux retours à la ligne et aux tabulations...
Modifié par jojaba (02 Oct 2010 - 08:14)
Modérateur
Ah ben, je viens de copier/coller le code que tu proposes et là ça fonctionne ! (voir le message précédent pourquoi je suis étonné). Il semblerait que quand on met des espaces autour des "=" dans la ligne:
$search='/\$smilies\s*=\s*array\(.*?\);/si';

ça donne donc ça :
$search = '/\$smilies\s*=\s*array\(.*?\);/si';

eh bien ça ne fonctionne pas ! Smiley eek
Je voudrais à présent ajouter un autre motif à remplacer et donc créer un tableau (comme vu dans le code collé précédemment), j'espère que ça fonctionnera...
Modérateur
Ah ben voilà, ça fonctionne !!! Smiley biggrin
Voici le code qui fonctionne donc :
/* Getting the content of the include/parser.php file */
    $file_content = file_get_contents(PUN_ROOT.'include/parser.php'); 
    if (strpos($file_content, 'ezbbc') === false) { 
            //Inserting the EZBBC code by replacing several existing lines 
            $search=array('~\$smilies\s*=\s*array\(.*?\);~si','~\$text.*/img/smilies/.*\$text\);~'); 
            $replacement=array("require PUN_ROOT.'plugins/ezbbc/ezbbc_smilies1.php';", "require PUN_ROOT.'plugins/ezbbc/ezbbc_smilies2.php';"); 
            $new_file_content = preg_replace ($search, $replacement, $file_content); 
            $fp = fopen (PUN_ROOT.'include/parser.php', 'wb'); 
            fwrite ($fp, $new_file_content); 
            fclose ($fp);                   
    }


Pour le deuxième motif, voici le bout de code qui est recherché :
$text = preg_replace("#(?<=[>\s])".preg_quote($smiley_text, '#')."(?=\W)#m", '<img src="'.$pun_config['o_base_url'].'/img/smilies/'.$smiley_img.'" width="15" height="15" alt="'.substr($smiley_img, 0, strrpos($smiley_img, '.')).'" />', $text);
Eric, pourrais-tu me confirmer tout ce qui a dit dans les 3 derniers messages STP ?