Changeset 99218 in spip-zone


Ignore:
Timestamp:
Aug 19, 2016, 1:21:41 PM (3 years ago)
Author:
marcimat@…
Message:

Signalé par Dut : lorsque l'option de date de création de la fiche est coché en configuration,
la page d'édition de profil sur l'espace public affiche des morceaux de code javascript.

Effectivement, depuis le passage en <div> des formulaires SPIP, nos expressions régulières
de capture peuvent se planter encore plus qu'avant, vu que ça en cherche par défaut qu'une
fin de </div>. Et il peut y en avoir plusieurs dans le bout de code qu'on souhaite capturer.
Ça se voyait moins avec les <li>, moins présents dans les saisies de formulaire.

Ici, non seulement la saisie date peut générer des <div> internes en plus, mais elle a aussi
du HTML dans du code javascript.

On se crée donc une fonction qui crée une expression régulière beaucoup plus sophistiquée
et complexe pour obtenir une balise avec un attribut spécifié, et son contenu interne,
même s'il contient des fermetures de la même balise.

Cette fonction pourrait être ajoutée dans SPIP je pense ; après quelques tests tordus,
elle semble fonctionner.

Ainsi inscription3_regexp_capturer_balise('class', 'editer editer_cextra_creation', true)
signifie qu'on recherche une classe 'editer ...' sur une balise div (par défaut),
le true signifiant que le nom de classe peut être n'importe où dans l'attribut.
False est plus adapté à la recherche d'attribut 'id' par exemple.

Location:
_plugins_/inscription/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/inscription/trunk/inscription3_pipelines.php

    r99213 r99218  
    10921092                if (isset($config['creation']) and $config['creation'] == 'on') {
    10931093                        $flux['data'] = preg_replace(
    1094                                 ",(<(li|div) [^>]*class=[\"']editer editer_creation.*<\/(li|div)>),Uims",
     1094                                inscription3_regexp_capturer_balise('class', 'editer editer_creation', true),
    10951095                                '',
    10961096                                $flux['data'],
    10971097                                1
    10981098                        );
    1099                         if ($flux['args']['contexte']['creation'] == '0000-00-00 00:00:00') {
    1100                                 $flux['args']['contexte']['creation'] = date('Y-m-d H:i:s');
    1101                         }
    11021099                        $flux['data'] = preg_replace(
    1103                                 ",(<(li|div) [^>]*class=[\"']editer editer_cextra_creation.*<\/(li|div)>),Uims",
     1100                                inscription3_regexp_capturer_balise('class', 'editer editer_cextra_creation', true),
    11041101                                '',
    11051102                                $flux['data'],
    11061103                                1
    11071104                        );
     1105
     1106                        if ($flux['args']['contexte']['creation'] == '0000-00-00 00:00:00') {
     1107                                $flux['args']['contexte']['creation'] = date('Y-m-d H:i:s');
     1108                        }
    11081109                        $inserer_saisie .= "<input type='hidden' name='creation' value='".$flux['args']['contexte']['creation']."' />\n";
    11091110                }
     
    11251126        }
    11261127        return $flux;
     1128}
     1129
     1130
     1131/**
     1132 * Retourne une expression régulière complexe de capture d'une balise spécifique
     1133 * ayant un attribut à une certaine valeur.
     1134 *
     1135 * Cette balise (une div par défaut) au milieu d'un code HTML peut contenir
     1136 * d'autres balises à l'intérieur.
     1137 *
     1138 * @example `inscription3_regexp_capturer_balise('id', 'content')
     1139 * @example `inscription3_regexp_capturer_balise('class', 'editer editer_truc', true)
     1140 *
     1141 * @link http://mac-blog.org.ua/regex-for-div-and-it-content/ pour l'inspiration
     1142 * @link http://php.net/manual/fr/regexp.reference.recursive.php#95568
     1143 *
     1144 * @note
     1145 *     Les expressions régulières ne sont pas adaptées pour traiter du html…
     1146 *     Mais on tente un miracle.
     1147 * @note
     1148 *     Mélange adapté entre 3 expressions :
     1149 *     ```
     1150 *     ",(<div [^>]*class=[\"']editer editer_creation.*<\/div>),Uims"
     1151 *     '#<div\s+class="s"[^>]*>((?:(?:(?!<div[^>]*>|</div>).)+|<div[^>]*>[\s\S]*?</div>)*)</div>#six'
     1152 *     "/<([\w]+)([^>]*?)(([\s]*\/>)|" . "(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/sm";
     1153 *     ```
     1154 *
     1155 * @param string $attr   
     1156 *     Attribut à chercher (exemple: class)
     1157 * @param string $valeur
     1158 *     Valeur à chercher (exemple: editer editer_truc)
     1159 * @param bool $flou       
     1160 *     True si l'attribut peut avoir d'autres éléments avant ou après la valeur cherchée
     1161 * @param string $balise
     1162 *     La balise qu'on recherche
     1163 * @param string $modificateurs
     1164 *     Modificateurs de l'expression (pas de modificateur U qui provoquerait un echec).
     1165 * @return string Expression régulière
     1166**/
     1167function inscription3_regexp_capturer_balise($attr, $valeur, $flou = false, $balise = 'div', $modificateurs = 'ims') {
     1168        $regexp =
     1169                # une balise indiquée avec un attribut ouvrant avec soit " ou ' (info capturée en \1)
     1170                '#<' . $balise . ' [^>]*' . $attr . '=(["\'])'
     1171                # la valeur cherchée, avec ou sans flou autour
     1172                . ($flou ? '(?:(?!\1).)*' . $valeur . '(?:(?!\1).)*': $valeur)
     1173                # la fin de guillement de l'attribut trouvé
     1174                . '\1'
     1175                # juste à la fin de la div ouvrante trouvée
     1176                . '[^>]*>'
     1177                # autant de couples de balises (dont autofermantes) et commentaires qu'on veut
     1178                        // des balises imbriquées ou non
     1179                        . '(?<balises>('
     1180                                // pas de début de balise
     1181                                . '([^<]*?)('
     1182                                        // une balise qui s'ouvre
     1183                                        . '<(?<tag>[\w]+)([^>]*?)'
     1184                                        // et soit
     1185                                        . '('
     1186                                                // 'une balise autofermante'
     1187                                                . '([\s]*\/>)'
     1188                                                // 'une fermeture de balise et soit
     1189                                                . '|(>(('
     1190                                                        . '('
     1191                                                                // pas de balise ouvrante
     1192                                                                . '[^<]*?'
     1193                                                                // ou commentaire html
     1194                                                                . '|<\!\-\-.*?\-\->'
     1195                                                                // ou script html
     1196                                                                . '|<script[^>]*>.*?<\/script>'
     1197                                                        .')'
     1198                                                        // ou recursion sur balise
     1199                                                        . '|(?&balises)'
     1200                                                // 0 ou plusieurs fois
     1201                                                . ')*)'
     1202                                                // et la fin de la balise
     1203                                                . '<\/(?&tag)[\s]*>)'
     1204                                        . ')'
     1205                                . ')'
     1206                        . ')*)'
     1207                        // pas de début de balise
     1208                        . '([^<]*?)'
     1209                # la fin de notre balise
     1210                . '</' . $balise . '>'
     1211                # les modificateurs
     1212                . '#' . $modificateurs;
     1213
     1214        return $regexp;
    11271215}
    11281216
  • _plugins_/inscription/trunk/paquet.xml

    r99149 r99218  
    22        prefix="inscription3"
    33        categorie="auteur"
    4         version="3.6.3"
     4        version="3.6.4"
    55        etat="stable"
    66        compatibilite="[3.1.0;3.1.*]"
Note: See TracChangeset for help on using the changeset viewer.