[SPIP Zone] aide sur regex (exclusion d'un mot)

bonjour,

je suis en train de mettre à jour le plugin convertisseur
pour passer d'un format wiki, rtf ... au format SPIP
ex. '''gras''' (mediawiki) convertie en {{gras}} (spip)

je bute sur les regex pour exclure des mots
motif de recherche '''([^''']*)''' motif de remplacement "{{\\1}}"
n'est pas bon car [^'''] n'exclut pas la chaîne ''' et équivaut à un simple [^']

'''test A''' est convertie en {{test A}}}
mais '''test B à l'huile''' ne passe pas

merci de votre aide

--
_________________________________________
http://www.erational.org

Salut,

2008/2/12, erational <erational@erational.org>:

'''test A''' est convertie en {{test A}}}
mais '''test B à l'huile''' ne passe pas

Ça a l'air plutôt compliqué... Comment faire savoir que la ' n'est pas
un début ou fin de zone à mettre en gras ? D'ailleurs je me demande:
ça fonctionne avec mediawiki ? Si oui, peut-être aller voir dans leur
code ?
Sinon y'a une idée qui met en jeu un peu plus qu'UNE regexp', c'est
dans un premier temps de protéger les vraies apostrophes (en les
remplaçant par autre chose qu'on est pas suseptible de trouver dans le
texte). J'imagine qu'on peut les repérer... Par ex. elles ne sont pas
précédées ou suives d'espace ou elles sont précédées d'une seule
lettre ? (et "jusqu'à" ?)... Faudrait trouver quelques règles qui
permettent d'exclure les cas limites comme "jusqu'à" et de gérer les
auteurs qui écriront "l' huile" (avec un espace)...

Et ensuite ta regexp pour mettre en gras. Enfin du récupère les
apostrophes protégées.

--
MARNE Bertrand

MARNE Bertrand wrote:

Salut,

2008/2/12, erational <erational@erational.org>:
  

'''test A''' est convertie en {{test A}}}
mais '''test B à l'huile''' ne passe pas

Ça a l'air plutôt compliqué... Comment faire savoir que la ' n'est pas
un début ou fin de zone à mettre en gras ? D'ailleurs je me demande:
ça fonctionne avec mediawiki ? Si oui, peut-être aller voir dans leur
code ?
  

cela marche sur mediawiki
leur stratégie est de détecter toutes les chaînes avec ''
et ensuite de parser méticuleusement les tableaux de résultats dans une fonction

    /**
     * Helper function for doAllQuotes()
     * @private
     */
    function doQuotes( $text ) {
        $arr = preg_split( "/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE );
        if ( count( $arr ) == 1 )
            return $text;
        else
        {
            # First, do some preliminary work. This may shift some apostrophes from
            # being mark-up to being text. It also counts the number of occurrences
            # of bold and italics mark-ups.
            $i = 0;
            $numbold = 0;
            $numitalics = 0;
            foreach ( $arr as $r )
            {
                if ( ( $i % 2 ) == 1 )
                {
                    # If there are ever four apostrophes, assume the first is supposed to
                    # be text, and the remaining three constitute mark-up for bold text.
                    if ( strlen( $arr[$i] ) == 4 )
                    {
                        $arr[$i-1] .= "'";
                        $arr[$i] = "'''";

http://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3/includes/Parser.php

il est peut être possible d'intégrer directement cette fonction ...

Sinon y'a une idée qui met en jeu un peu plus qu'UNE regexp', c'est
dans un premier temps de protéger les vraies apostrophes (en les
remplaçant par autre chose qu'on est pas suseptible de trouver dans le
texte). J'imagine qu'on peut les repérer... Par ex. elles ne sont pas
précédées ou suives d'espace ou elles sont précédées d'une seule
lettre ? (et "jusqu'à" ?)... Faudrait trouver quelques règles qui
permettent d'exclure les cas limites comme "jusqu'à" et de gérer les
auteurs qui écriront "l' huile" (avec un espace)...

Et ensuite ta regexp pour mettre en gras. Enfin du récupère les
apostrophes protégées.
  

il est effectivement peut être difficile de s'en sortir avec une seule regex.
je vais essayer ta stratégie. merci pour les conseils

--
_________________________________________

erational a écrit :

bonjour,

je suis en train de mettre à jour le plugin convertisseur
pour passer d'un format wiki, rtf ... au format SPIP
ex. '''gras''' (mediawiki) convertie en {{gras}} (spip)

je bute sur les regex pour exclure des mots
motif de recherche '''([^''']*)''' motif de remplacement "{{\\1}}"
n'est pas bon car [^'''] n'exclut pas la chaîne ''' et équivaut à un simple [^']

'''test A''' est convertie en {{test A}}}
mais '''test B à l'huile''' ne passe pas

merci de votre aide

peut être bien avec '`['{3}]`' mais franchement je sais pas trop
regarde ce site http://www.expreg.com/metacaracteres.php

erational wrote:

'''test A''' est convertie en {{test A}}}
mais '''test B à l'huile''' ne passe pas

ais-je bien compris la question ?

echo preg_replace("#\'\'\'(.*)\'\'\'#", "{{{\\1}}}", "'''test B à l'huile'''");

merci pour les infos et l'aide sur les regex.

j'ai résolu le problème en utilisant le parseur de médiawiki pour les quotes (fonction de 160 lignes)
au lieu d'essayer de trouver une hypothétique regex

ais-je bien compris la question ?

echo preg_replace("#\'\'\'(.*)\'\'\'#", "{{{\\1}}}", "'''test B � l'huile'''");

le motif "#\'\'\'(.*)\'\'\'#" ne fonctionne pas
il est trop large et ne comprend pas la fin

peut être bien avec '`['{3}]`' mais franchement je sais pas trop
regarde ce site http://www.expreg.com/metacaracteres.php

en fait, c'est plus compliqué que cela pour les exclusion ^
il faut exclure le mot et non le motif

--
_________________________________________