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
'''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.
'''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] = "'''";
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
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
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