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

C’est l’exemple de la doc… Mais je suis d’accord :slight_smile:

1 « J'aime »

Merci pour toutes les infos.

Pour moi ça donne ça donc.

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

Mais ca ne fonctionne pas.

Ca donne en affichage:
[(le texte en brut|replace{^.?[.?->(\d+)].*$, $1})]

Ce serait lié au spip 2 et à son php associé ?

Franchement, avec SPIP 2, la solution du squelettes/mes_fonctions.php avec une fonction spécifique pour extraire ce que tu veux sera plus efficace que de chercher à le faire en syntaxe SPIP.

PS : pourquoi rester en SPIP 2 ?

1 « J'aime »

Tout à fait.
Et tu peux tester ton filtre par exemple sur onlinephp.io
Mais aussi : dans ton texte ya que ce lien ou autre chose ?
Et est-ce qu’il peut y avoir plusieurs liens ?
Et sinon qu’est ce que tu fais pour l’empêcher ?
Et sioui, qu’est ce que tu veux comme résultat dans ce cas là ?

Dans le cas où tu veux récupérer le premier lien seulement, ce filtre adapté du 1er cité ici marche :
https://onlinephp.io/c/05da5

1 « J'aime »

Bonjour,
Je n’ai pu répondre plus tot car le forum m’a demandé d’attendre 18h avant un nouveau message !

Je m’en suis sorti avec cette formule:

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

Merci encore de votre aide.
Je vais poursuivre la mise en place.

1 « J'aime »

Au moins préfère \s*(\d+)\s* sinon ça marchera pas s’il y a un espace à gauche ou à droite du n°.
No comment pour le reste.

1 « J'aime »

ah je ne savais pas que la syntaxe acceptait des espaces ! merci pour l’info :slight_smile: @Beru59 : à prendre en compte :

#SET{reg1, ^.*?[.*?->\s*(\d+)\s*].*$}

Ah, il aime pas du tout cette nouvelle synthaxe.

" Warning: preg_replace() [function.preg-replace]: Compilation failed: range out of order in character class at offset 9 in C:\wamp****\ecrire\inc\filtres.php on line 2118"

Prob de version de sip ?

Ceci dit, j’ai fait le test: un espace à gauche et/ou à droite du chiffre ne perturbe en rien, ni le lien spip, ni (du coup ? ) la récupération de l’id_article.

Ah c’est parce que j’ai oublié d’échapper les crochets (qui ont une signification spéciale en expression rationnelle). Voilà :

#SET{reg1, ^.*?\[.*?->\s*(\d+)\s*\].*$}

Ca marche.
Merci

1 « J'aime »

Bonjour,

ET cela serait-il possible (comme l’a évoqué Jluc) de récupérer plusieurs liens (dans le même enregistrement) ?
Et de mettre chacun d’eux dans une variable.
Une variable dans une variable ? Ouille ?

En d’autres termes, sur un squelette article, je veux afficher les mots clés uniques de tous les articles appelés sur cette même page via des liens mis dans la saisie d’un champs.

Pour rappel je suis en SPIP 2

boucle
trouver (dans le contenu d’un champs) et isoler un chiffre (situé dans un lien spip) dans une variable qui s’appellerait variable1, puis vriable2 pour le 2e lien trouvé, etc
fin de boucle

Boucle mot cle
Récupérer tous les mots clés associés à chacun des id_article (lesquels correspondent aux liens)
Retirer les doublons, puis afficher la liste.
fin de boucle mot clés

Si cela vous semble intéressant et pertinent, je peux donner l’utilisation concrète de cette recherche. Les objectifs.
Beru

Hello,

Pour être sûr qu’on en est tous au même point, est-ce que tu pourrais nous copier-coller ton bout de squelette actuel ? Essaie d’utiliser la fonction « code » (bouton </> de l’éditeur du forum) afin que le forum ne mange pas des bouts de ton code :slight_smile:

Voici la chose insérée dans le squelette article.html

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

	Mots clés associés au rush (N° base: #GET{reg2})
		
<BOUCLE_mots(MOTS) {id_article=#GET{reg2}}>
		 #TITRE -
		</BOUCLE_mots>

Ce la fonctionne bien avec un seul lien dans le champs TEXTE

Peut-être quelque chose comme ça ? A adapter pour Spip 2… Je peux toujours pas tester :smiley:

// On récupère toutes les séquences constituées d'une suite de caractères
// ne contenant pas [ (cette suite peut potentiellement être de longueur nulle afin
// de catcher un lien en tout début d'article),
// suivi de [... -> (suite de chiffres)], suivi de nouveau d'une
// suite de caractères qui ne commence pas par [ (qui peut également être
// de longueur nulle )
#SET{reg1, ([^\[]*)\[.*?->\s*(\d+)\s*\]([^\[]*)}
// On remplace toutes ces séquences par "(suite de chiffres)," (nota : pas 100% sûr de ma syntaxe ici)
#SET{reg2, (#TEXTE*|replace{#GET{reg1}, '$2,'})}

// normalement à ce point là on a une liste du genre "1,2,3,4,"

// on capture la dernière virgule... (note : pas 100% sûr de la syntaxe pour utiliser
// le signe "," dans une expression régulière)
#SET{reg3, \,$}
// et on la remplace par rien
#SET{regfinal, (#GET{reg2}|replace{#GET{reg3}, ''})}

// normalement maintenant on a dans regfinal une liste du genre "1,2,3,4"

// on peut utiliser une boucle avec IN...

<BOUCLE_mots(MOTS) {id_article IN #GET{regfinal}}>

Note : par contre je ne sais pas comment « annuler » le traitement s’il n’y a aucun lien dans l’article traité, peut-être qu’un.e gourou Spip peut nous éclairer sur ce point :slight_smile:

Merci pour cette propo.

En réalité le #GET{regfinal} n’affiche rien.

ET aussi affiche un warning:
" Warning: preg_replace() [function.preg-replace]: No ending delimiter ‹ / › found in C:\wamp\www\baseperso\ecrire\inc\filtres.php on line 2118"

Pur être plus précis, il affiche

reg1 :
([^[])[.?->\s*(\d+)\s*]([^[]*)

reg2 :
affiche le denier chiffre (correspondant au dernier lien rencontré, puis une virgule, puis ce qu’il y a d’inscrit derrière

reg3
affiche une \

reg final
N’affiche rien

ok, bon clairement il y a un bug sur cette ligne:

#SET{reg3, \,$}

→ est-ce que quelqu’un.e a une idée de comment matcher une virgule avec les expressions régulières en spip? Est-ce que #SET{reg3, ,$} marcherait, bêtement ? Ou c’est plus compliqué ?

@Beru59 est-ce que tu pourrais partager le texte brut de l’article que tu utilises comme test, et le résultat exact affiché par reg2 ? (en utilisant les blocs code pour qu’on ait bien tout visible ici)

Pour le texte exemple contenu dans le champs TEXTE sur un des articles :

liens: 1er [85->885] et 2e [87->886] , puis 3e [1ere partie->887] et 4e [2e partie->947] et puis c’est tout.

Sinon, j’ai testé de supprimer la \ et je n’ai plus de Warning.

Mais 2 erreurs signalées avec ce message:

Filtre ,$} #SET{regfinal, (#GET{reg2}|replace{#GET{reg3}, ‹  ›})} RESULTAT reg1 #GET{reg1}
reg2 #GET{reg2}
reg3 #GET{reg3}
reg final #GET{regfinal} non défini

et encore: Argument manquant dans la balise SET

Pardon, est-ce que tu peux utiliser les balises code </> sur le forum pour les textes bruts et les codes spip ? C’est difficile de lire le contenu sinon :slight_smile: merci ! Si tu peux éditer ton dernier message, le forum cache certains caractères

OUi, mais là dans mon dernier message , il n’y a pas de code spip.

Ca c’est le texte brut dans le champs #TEXTE de l’article

liens: 1er [85->885] et 2e [87->886] , puis 3e [1ere partie->887] et 4e [2e partie->947] et puis c’est tout.

Ce qui donne à l’affichage sur le site, avec les liens qui vont bien:

liens : 1er 85 et 2e 87 , puis 3e 1ere partie et 4e 2e partie et puis c’est tout

Et sinon pour les erreurs de squelette que SPIP signale j’ai fait du copier-coller.