|
Doublons articles/documents [si, si...]
on considère que les liens qui nous intéressent, placés directement dans le corps d’un texte, contiennent la forme :
-> un tiret suivi obligatoirement d’un signe supérieur à
\s* suivi ou non d’un ou plusieurs espace
(doc|emb|im|image|img) suivi obligatoirement de doc ou emb ou img ou im ou image
(\d+) suivi obligatoirement d’au moins un chiffre
(\s*|(\|\w+)*) suivi soit d’un ou plusieurs espace, soit d’un ou plusieurs pipe suivi de lettres,
] suivi obligatoirement d’un crochet fermant
ce qui permet de reconnaitre les liens du type :
->; doc25]
->im12 ]
-> doc467|blabla ]
etc
on va récupérer les liens de #TEXTE,
puis en extraire les numéros (les id) des documents,
puis les assembler dans une chaine du type (25|12|467)
enfin on passera cette chaine en critère
{id_document!==^(#TEXTE*|liens_inclus)$}
à notre boucle DOCUMENTS
la fonction à poser dans mes_fonctions.php :
// extrait les ID des documents passes en liens dans un texte
// et les retourne sous forme de liste
// (44|25|12|5)
function liens_inclus($texte) {
$liste = '';
$liens = preg_match_all(",->\s*(doc|emb|im|image|img)(\d+)(\s*|(\|\w+)*)],", $texte, $r);
if (!empty($r[2])) {
$l_ex = array_unique($r[2]);
$liste = implode("|", $l_ex);
}
return '(' . $liste . ')';
}
cette fonction-filtre est à appeler dans la boucle DOCUMENTS elle-même incluse dans la boucle ARTICLES par :
<BOUCLE_doc(DOCUMENTS) {id_article} {id_document!==^(#TEXTE*|liens_inclus)$}>
la requête générée sera du type :
SELECT documents.id_document
FROM `base_dev`.spip_documents AS `documents`
WHERE NOT(documents.id_document REGEXP '^(44|25|12|5)$')
AND (documents.taille > 0 OR documents.distant="oui")
cqfd
|