[Résolu] Récupérer une partie du contenu d'un champs

Bonjour,

En utilisant #set et #get,
je voudrais récupérer une partie du contenu d’un champs:
c’est en occurrence un id-article mis dans un lien HREF de SPIP.

Le champs, dans mon cas, c’est #TEXTE (article) qui se présente sous la forme
[le lien->1692]
A l’affichage du site j’obtiens « le lien ». (qui renvoit vers l’article 1692).
Ca je sais le récupérer avec #SET.

Mais moi je voudrais qu’il me récupère, le chiffre. C’est à dire ce qui ets compris entre →
et le crochet qui referme.
Ici, donc 1692. C’est un id_article et comme ça je peux aller chercher un champs de cet nouvel article.

Suis-je clair ?
:wink:

Je précise que c’est un site en spip 2. (je dois rester dans cette version)

Beru

J’ai trouvé ça comme exemple pour enlever une partie du chemin d’un fichier:

#SET{reg1, ‹ (^.*/[^/]+[/]) ›}
#SET{reg2, ‹ .[\w-_]+? ›}
[(#FICHIER|replace{#GET{reg2}}|replace{#GET{reg1}})]

Le tout serait d’avoir le mode d’emploi pour toutes ces commandes.
C’est du dos ?

Hello, je crois qu’en Spip 2 c’est déjà possible de récupérer le contenu de ton article (la balise #TEXTE) avant que Spip n’ait remplacé ton code brut [lien->1692] par <a href="mon_chemin_vers_l_article_1692>.

Il faut remplacer #TEXTE par #TEXTE* pour récupérer les données brutes qui sont saisies dans l’admin (source: #BALISE* et #BALISE** - SPIP.

Ensuite, je ne pense pas que tu as besoin d’utiliser #SET et #GET, tu peux utiliser directement ton filtre replace: dans le cas où tu n’as que un seul lien dans chaque article, ça pourrait ressembler à ça :

[(#TEXTE*|replace{ '^.*?\[.*?->\(\d+\)'\].*$', $1})]

La suite de hiéroglyphes n’est pas du DOS mais une expression rationnelle (ou expression régulière), c’est un peu barbare mais bien puissant pour récupérer des bouts de chaîne dans du texte.

Celle qui est ci-dessus se traduirait par:

  • sélectionner tout à partir du premier caractère (représenté par ^) jusqu’au premier crochet ouvrant [
  • sélectionner tout le contenu du crochet ouvrant jusqu’à la fin de la flèche ->
  • sélectionner une suite de chiffres et la stocker dans un groupe ( \d représente les chiffres de 0 à 9, les parenthèses représentent le stockage dans un groupe)
  • sélectionner tout depuis le crochet fermant jusqu’à la fin du texte (représenté par un dollar).

Le second paramètre $1 indique à Spip de remplacer tout ce qui a été sélectionné par la valeur du groupe ci-dessus (dans notre cas, uniquement les chiffres, donc).

Théoriquement le code ci-dessus remplace donc tout le contenu de #TEXTE* par juste le nombre 1692. A noter que je n’ai pas testé en vrai :smiley: .

Avec l’avantage que ce faisant ton squelette sera indépendant du mode d’affichage des liens choisi par le webmestre.

Ne serais-tu pas en train de réinventer le plugin Poly-hiérarchie ?

Ou, c’est c’est bien seulement un élément d’un autre article que tu cherches à récupérer (et pas l’article entier), pourquoi polluer le champ texte avec un contenu fonctionnel ?
Tu pourrais utiliser un champ extra pour ça…

Merci de cette idée.
J’ai testé mais en réalité cela affiche

[([monlienvisible->1692]|replace{ ‹ ^.?[.?->(\d+) ›].*$’, $1} )]

Est-ce que cela ne viendrait pas qu’il interprète mal les [ de la formule et les [ qu’il doit prendre en compte ?

Par ailleurs j’ai besoin de set et get, dans la mesure ou j’ai besoin sur la page article qu’il m’isole cette variable (id_article),
pour dans un nouveau squelette pouvoir afficher à la fois le champs de l’article et un champs qui appartient à l’id_article en lien.

Je ne connais pas ce plugin.Mais il semble quand je le regarde que je ne suis pas dans ce cas-là.

Moi, le lien qui existe entre deux articles, il est fait « à la main » à chaque saisie, et de plus en mode lien spips ( [lelien->NO dans la base] )

Et ensiuite je veux faire un squelette qui m’affiche les champs de l’article principal et un champs (ou deux) pris sur l’article relié « à la main ».
Beru

Est-ce que cela ne viendrait pas qu’il interprète mal les [ de la formule et les [ qu’il doit prendre en compte ?

Je pense que c’est sans doute qu’il manque un truc sur mon idée de code pour que ça marche :sweat_smile: . Désolé je vais pas pouvoir tester tout de suite…

Alors déjà il y a une erreur de syntaxe dans mon truc, ça devrait plutôt ressembler à ça :

[(#TEXTE*|replace{ '^.*?\[.*?->\(\d+\)\].*$', $1})]

(il y avait une apostrophe de trop)

Oui en effet.
Cependant ça ne change pas le résultat.

Effectivement en supprimant les [ et les - > dans la saisie cela ne change rien à l’affichage.
IL continue de ne pas tenir compte de la demande

Alors tout en bas de la doc il y a une mention qui indique que ça ne marche pas exactement pareil avec Spip 2.1 et antérieur, à cause des crochets justement… Mais est-ce que ceci pourrait marcher?

#SET{ma_regexp, ^.*?\[.*?->\(\d+\)\].*$}
[(#TEXTE*|replace{#GET{ma_regexp}, $1})]

Non .
Il se contente de m’afficher le contenu entier du champs. (mais pas le code au moins)

En bidouillant beaucoup et sans trop savoir ce que je fais vraiment, j’ai obtenu qu’il m’affiche le numéro mais avec le crochet de fermeture.

Et puis, le souci, c’est que s’il n’y pas le fameux ->, il affiche tout le reste.

J’ai fait ça:

#SET{reg1, ‹ .?->\d ›}
#SET{reg2, ‹  ›}
[(#TEXTE*|replace{#GET{reg1}, #GET{reg2}})]

Sachant que « d » si je met « d+ » il m 'enlève un chiffre.

Beru

Sous SPIP 2, il est sans doute plus simple de développer un filtre php, facile à débuguer si besoin, non ?

[(#TEXTE*|recupere_id)]

avec dans config/mes_options.php :

function recupere_id($texte) {
  return preg_match( ',\[.*?\->(\d+)\],', $texte, $regs) ? $regs[1] : '';
}

(à adapter, non testé !)

1 « J'aime »

Pourquoi pas mais j’avoue j’aurais besoin d’une légère explication de texte de ton code pour pouvoir l’adapter .
:wink:

Tu as quelques bases en php ? Que veux-tu savoir ? Les filtres de SPIP sont ouverts à toutes les fonctions php, mais aussi à des fonctions maison.

J’ai testé juste la partie pour extraire les chiffres (correspondant à l’id-article relié au au principal) mais ça ne donne rien.

Pour l’instant j’ai l’impression que mon souci est là: comment récupérer les chiffres juste après le - > et avant le crocher fermant.

Une fois réglé cela en effet pourquoi pas passer par un filtre php.

J’'aimerais comprendre la formule:

^.*?\[.*?->\(\d+\)\].*$'

ESt-ce que ça signifie:

Tu supprimes tout depuis le début de la chaine de caractère \ jusqu’à ce qui suit - > \ puis tu sélectionnes les chiffres qui suivent \ puis tu retires ce qui suit qui n’est pas un chiffre \ et tu mets le tout dans $

J’ai bon ?
:wink:

On peut trouver un mode d’emploi pour tous ces signes ?

Créer un filtre comme dit Pat serait en effet la chose à faire, bien plus simple à lire, écrire et mettre au point surtout avec les regexp. Mais si cette fonction ne sert que comme filtre dans des squelettes, il serait préférable de la mettre dans le fichier mes_fonctions.php du site ou dans le fichier de fonctions de l’éventuel plugin squelette plutôt que dans le fichier d’options.

Un super outil pour tester et aveoi la signification (et de la doc) : regex101: build, test, and debug regex

Ce qui permet de voir qu’en PHP, il ne faut pas les \ devant les ( et )

1 « J'aime »

Merci RealET! J’avais un doute car la syntaxe sur la doc Spip donne l’impression qu’il faut échapper les parenthèses (ici) :

Il est possible de capturer des valeurs dans l’expression régulière en 1er argument, et le 2eme argument peut faire référence aux valeurs capturées.
Exemple pour extraire le nom d’un fichier à partir de son chemin complet :

[(#FILE|replace{^.*/\(\[^/\]*\)$,$1})]

Pour les morceau de nom d’un fichier, il vaut beaucoup mieux utiliser PHP: pathinfo - Manual