[Résolu] Pluxml 5.7 : erreurs après avoir publié un titre en russe

SudwebdesignSudwebdesign Member
mai 2019 modifié dans Bogues
aucune date et impossible d'aller rééditer l'article un fois quitté
(a part si on saisit l'adresse article.php?a=#### a la main)

testé avec comme titre : Заголовок статьи
OU
Аа Бб Вв Гг Дд Ее Ёё Жж Зз Ии Йй Кк Лл Мм Нн Оо Пп Рр Сс Тт Уу Фф Хх Цц Чч Шш Щщ Ъъ Ыы Ьь Ээ Юю Яя

clic sur publier (ou brouillonner) et pif le ch#en !

Mise A Jour du coeur de PluXml 5.7 afin d'utiliser les caractères cyriliques a-z >>> a-я

Si cela peut dépanné quelques un(e)s ;)

Explications :

Après quelques recherches pour trouver le pourquoi du comment en russe lorsque l'on crée et publie un article avec le titre par défaut il y avais pleins de notices du style undefined index de la classe plxdate qui n'avaient aucun sens 8o

En réalité il s'agit des expression régulières qui oublie quelques lettres en cyriliques et artInfoFromFilename du moteur capture rien, cela "matche" a coté.

L'idée est venus de cette réponse : https://stackoverflow.com/questions/1716609/how-to-match-cyrillic-characters-with-a-regular-expression (entres autres)

@AlexErygin For Russian only characters it is: [ЁёА-я] (where А is Russian). The unicode code for Russian а is right after Я, so you don't need 2 ranges. The unicode codes for Ёё is not between А-я so you need to specify Ёё separately.

et comme les Ёё sont transformés en e pour les url (avec cette MAJ)
il manque 4 lettres : plxutils::removeAccents($str,$charset='utf-8')

voici la #soluce qui a fait tout #tombé_en_marche
a-z0-9 ::: latin : 26 letters [:alnum:] #origin
a-я0-9 ::: A-Яa-я0-9 ::: cyrilic : 33 letters #TEM

PETIT PLUS inside zip :
title2url & title2filename($str)
if(empty(trim($str))) return '';#speedup
$str = mb_convert_case(plxUtils::removeAccents($str,PLX_CHARSET), MB_CASE_LOWER, PLX_CHARSET);//php.net/manual/fr/function.strtolower.php#90061 (php4 > 7)

+ langues L_LONG_#MONTH ;)
+ media et plugins_mngr js plugFilter() //Fix if filter string only contains whitespace (ie. spaces, tabs or line breaks v2)

tchuss

Notre temps est la seule monnaie vraie ;)

Site, Dépôt, framagit, MyShop, Factux

#mozinor président

Mots clés:

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Cela s'appelle de la translittération.

    On en a parlé il y a un an :
    https://forum.pluxml.org/viewtopic.php?id=6090

    J'avais créé un plugin express à l'époque
  • SudwebdesignSudwebdesign Member
    janvier 2019 modifié
    bazooka07 a écrit:
    Cela s'appelle de la translittération.

    On en a parlé il y a un an :
    https://forum.pluxml.org/viewtopic.php?id=6090

    J'avais créé un plugin express à l'époque

    Aucune idée s'il s'agit de translittération, mais a priori non, car le but du jeu est que tout les caractères en cyrilliques soit possible dans l'url et le nom du fichier ;)

    Après quelques tests de la précédente maj, il a un pb avec les titres avec un _ (tiret bas) ou : (deux points) il refait la même erreur :/

    Après quelques recherches et essais, il y a 2 bourdes (title2url et title2filename) dans le fichier inc/class.plx.utils.php au niveau des expreg
    [^[:alnum:]] est égale a [^a-zA-Z0-9] et non à [^[a-zA-Z0-9]] :8
    tout roule bien avec celle-ci : [^A-Яa-я0-9]
    Il reste les _ (tiret-bas) mais pourquoi? Il sont remplacés avec strtr ;)

    Vous pouvez télécharger la nouvelle archive ici

    Mais il y a que class.plx.utils.php qui a changé :)
    Voici le bout de code, pour qui ça intéresse.
    [== PHP : class.plx.utils.php ==]
    	/**
    	 * Méthode qui convertit une chaine de caractères au format valide pour une url
    	 *
    	 * @param	str		chaine de caractères à formater
    	 * @return	string		nom d'url valide
    	 **/
    	public static function title2url($str) {
    
    		if(empty($str)) return '';#speedup
    		$str = mb_convert_case(plxUtils::removeAccents($str,PLX_CHARSET), MB_CASE_LOWER, PLX_CHARSET);//php.net/manual/fr/function.strtolower.php#90061  (php4 > 7)
    		$str = preg_replace('/[^A-Яa-я0-9]+/',' ',$str);//$str = preg_replace('/[^[:alnum:]]+/',' ',$str);
    		return strtr(trim($str), array(' '=>'-', '_'=>'-'));
    	}
    
    	/**
    	 * Méthode qui convertit une chaine de caractères au format valide pour un nom de fichier
    	 *
    	 * @param	str		chaine de caractères à formater
    	 * @return	string		nom de fichier valide
    	 **/
    	public static function title2filename($str) {
    
    		if(empty($str)) return '';#speedup
    		$str = mb_convert_case(plxUtils::removeAccents($str,PLX_CHARSET), MB_CASE_LOWER, PLX_CHARSET);//php.net/manual/fr/function.strtolower.php#90061  (php4 > 7)
    		$str = strtr($str, array('|'=>'', ':'=>''));//str_replace('|','',$str);
    		$str = preg_replace('/\.{2,}/', '.', $str);
    		$str = preg_replace('/[^A-Яa-я0-9]+/',' ',$str);//$str = preg_replace('/[^[:alnum:]|.|_]+/',' ',$str);
    		return strtr(ltrim(trim($str),'.'), array(' '=>'-', '_'=>'-'));
    	}
    

    Au passage, merci a https://myregextester.com/index.php
    @+

    Notre temps est la seule monnaie vraie ;)

    Site, Dépôt, framagit, MyShop, Factux

    #mozinor président

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    janvier 2019 modifié
    Pour mon plugin kzUrify, j'avais utilisé cette librairy :
    https://github.com/jbroadway/urlify
    Elle n'est pas limitée qu'au russe.

    Et le russe de St-Petersbourg, qui avait lancé la discussion, semblait très satisfait de mon plugin.

    Mais pour des raisons professionnelles, je n'ai pas trop le temps de faire la mise à jour.

    Pour tester les expressions régulières, il y a regex101 assez populaire et sympa d'utilisation :
    https://regex101.com/
Connectez-vous ou Inscrivez-vous pour répondre.