Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Decoupage de texte par regexp

8 réponses
Avatar
CrazyCat
Bonjour,

j'ai un petit problème à vous soumettre concernant du traitement de
chaine de caractères avec une regexp.

Le but est de modifier la présentation d'un texte à la volée en se
basant sur des balises internes, mais pas en faisant un simple
changement de balises. Il y a tout un traitement de fait sur le texte en
fonction de l'attribut de la balise.

Par exemple, ce texte-ci:
j'ai traduit [lang="en"]my taylor is rich[/lang] par [lang="kn"]grrr ahn
rho[/lang] et c'est cool.
donnerait après traitement:
j'ai traduit <p>my <u>taylor</u> is <b>rich</b></p> par <p><u>grrr</u>
ahn <u>rho</u></p> et c'est cool.

Il me faut donc trouver une regexp capable de sortir chaque occurence de
[lang="$ln"]...[/lang], de traiter en fonction de $ln et de réinjecter
ça à la place de ce qui y était initialement.
Sachant que le traitement se fait par une classe qui me permet de mettre
en forme en fonction du langage.

Merci d'avance à ceux qui pourront me donner le point de départ :)

P.S.: lang="kn" => Klingon

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net

8 réponses

Avatar
Olivier Miakinen

Par exemple, ce texte-ci:
j'ai traduit [lang="en"]my taylor is rich[/lang] par [lang="kn"]grrr ahn
rho[/lang] et c'est cool.
donnerait après traitement:
j'ai traduit <p>my <u>taylor</u> is <b>rich</b></p> par <p><u>grrr</u>
ahn <u>rho</u></p> et c'est cool.


http://fr.php.net/manual/fr/function.preg-replace-callback.php

function remplace_par_langue($matches)
{
$langue = $matches[1];
$texte = $matches[2];

/* ici traitement avec d'autres preg_replace */
return $resultat;
}

$balise1 = '[lang="([a-z]+)"]';
$contenu = '([^[]*)';
$balise2 = '[/lang]';
$pattern = "|$balise1$contenu$balise2|";

preg_replace_callback($pattern, "remplace_par_langue", $texte);

(non testé)

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
CrazyCat
Olivier Miakinen wrote:
http://fr.php.net/manual/fr/function.preg-replace-callback.php


Exactement ce que je voulais, c'est pile-poil la piste que je cherchais.
Je vais faire des tests et je transmettrais mes résultats :)

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net

Avatar
CrazyCat
Bon, ça marche presque nickel, voici mes 2 lignes utiles:

$pattern = "µ[lang=([a-z]+)]([^[]*)[/lang]µ";
$essai_txt = preg_replace_callback($pattern, "hl_code", $essai);

Ma question subsidiaire, c'est comment faire pour bien prendre ce qui
est strictement contenu entre [lang=XX] et [/lang]?
Parce que si jamais dans mon texte à traiter, j'ai un truc du genre
[:elo] (c'est de la phonétique), ça plante.

bref, grosso modo il faudrait que je trouve par quoi remplacer [^[]*
pour avoir un [^[/lang]]* (qui ne marche pas)

Merci bien


--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net
Avatar
CrazyCat
Bon, après essai:

$essai = 'j'ai traduit [lang="en"]my taylor is rich[/lang] par
[lang="kn"]grrr ahn rho[/lang] et c'est cool.';

function hl_words($matches) {
$parse = new parser();
$parse->lang = $matches[1];
return $parse->parse_it();
}

$pattern = "µ[lang=([a-z]+)]([^[]*)[/lang]µ";
$essai_txt = preg_replace_callback($pattern, "hl_words", $essai);

Il doit y avoir un problème avec mon pattern parce que seul la première
langue est modifié, l'autre est prise comme du texte normal.


--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net
Avatar
Olivier Miakinen

$pattern = "µ[lang=([a-z]+)]([^[]*)[/lang]µ";

Ma question subsidiaire, c'est comment faire pour bien prendre ce qui
est strictement contenu entre [lang=XX] et [/lang]?
Parce que si jamais dans mon texte à traiter, j'ai un truc du genre
[:elo] (c'est de la phonétique), ça plante.

bref, grosso modo il faudrait que je trouve par quoi remplacer [^[]*
pour avoir un [^[/lang]]* (qui ne marche pas)


$pattern = "µ[lang=([a-z]+)](.*)[/lang]µU";

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
CrazyCat
Olivier Miakinen wrote:
bref, grosso modo il faudrait que je trouve par quoi remplacer [^[]*
pour avoir un [^[/lang]]* (qui ne marche pas)
$pattern = "µ[lang=([a-z]+)](.*)[/lang]µU";



mis à part qu'il faut aussi autoriser le n, ça fonctionne parfaitement.
regexp finale: $pattern = "µ[lang=([a-z]+)]((n|.)*)[/lang]µU";

Je ne m'y ferais jamais à toutes ces options!!!!

Un grand merci à toi
--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net


Avatar
Olivier Miakinen

$pattern = "µ[lang=([a-z]+)](.*)[/lang]µU";


mis à part qu'il faut aussi autoriser le n, ça fonctionne parfaitement.
regexp finale: $pattern = "µ[lang=([a-z]+)]((n|.)*)[/lang]µU";


Héhé...
$pattern = "µ[lang=([a-z]+)](.*)[/lang]µUs";

Je ne m'y ferai[] jamais à toutes ces options!!!!


<http://fr2.php.net/manual/fr/reference.pcre.pattern.modifiers.php>
U (PCRE_UNGREEDY)
s (PCRE_DOTALL)
</>

Au passage, le caractère « µ » ne me semble pas très lisible tant il
ressemble aux autres lettres minuscules. Si vraiment tu veux utiliser un
caractère de la partie haute de ISO-8859-1, voici quelques propositions.

$pattern = "¦[lang=([a-z]+)](.*)[/lang]¦Us"; (166)
$pattern = "§[lang=([a-z]+)](.*)[/lang]§Us"; (167)
$pattern = "¶[lang=([a-z]+)](.*)[/lang]¶Us"; (182)
$pattern = "¿[lang=([a-z]+)](.*)[/lang]¿Us"; (191)

$pattern = "«[lang=([a-z]+)](.*)[/lang]«Us"; (171)
$pattern = "»[lang=([a-z]+)](.*)[/lang]»Us"; (187)

Ma préférence va au caractère « ¦ » qui est différent de « | » mais
tout aussi lisible à mon humble avis.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
CrazyCat
Olivier Miakinen wrote:
mis à part qu'il faut aussi autoriser le n, ça fonctionne parfaitement.
regexp finale: $pattern = "µ[lang=([a-z]+)]((n|.)*)[/lang]µU";
$pattern = "µ[lang=([a-z]+)](.*)[/lang]µUs";



Well done, je ne pense jamais assez à regarder les options en détail

Au passage, le caractère « µ » ne me semble pas très lisible tant il
ressemble aux autres lettres minuscules. Si vraiment tu veux utiliser un
caractère de la partie haute de ISO-8859-1, voici quelques propositions.


Effectivement, j'ai utilisé arbitrairement ce caractère mais en temps
normal j'utilise plutôt ! ou #

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net