5568 sujets

Sémantique web et HTML

Bonjour

Tout est dans le titre. C'est sûrement une erreur simple, mais je cherche depuis plusieurs heures sans trouver...
J'appelle une fonction depuis une page html (j'ai vérifie, la fonction est bien appelée, et la variable $texte est transmise).
Je devrait avoir en retour mon texte avec des 'b' remplaçant les 'a', mais le résultat est null.

function sans_tag($texte) {
   $recherche = "a";
   $remplacement = "b";
   $texte = preg_replace($recherche, $remplacement, $texte, -1);
   return $texte;
}


Le site en question est construit sous spip, celà peut-il avoir une incidence? (Fonction dans le fichier mes_fonctions.php)

Merci
Modifié par phil_zic (12 Nov 2019 - 12:39)
Merci,

Dommage pour moi, str_replace ne convient pas, car j'ai besoin d'utiliser les expressions régulières pour retirer certains tags.
Tu dois mettre un délimiteur lorsque tu fais une expression régulière :


function sans_tag($texte) {
   $recherche = "{a}";
   $remplacement = "b";
   $texte = preg_replace($recherche, $remplacement, $texte, -1);
   return $texte;
}

https://www.php.net/manual/fr/regexp.reference.delimiters.php

Sinon, pourquoi ne pas utiliser https://www.php.net/manual/fr/function.strip-tags.php

Aussi tu as des filtres disponibles directement dans le langage de spip : https://www.spip.net/fr_article901.html#s-Filtres-de-texte
Meilleure solution
Merci pour le délimiteur, c'était ça. Smiley biggrin

strip_tags ne convient pas, car je cherche l'inverse: supprimer uniquement un tag (en l'occurence, <a>) mais garder tous les autres.

Même chose pour les filtres de Spip; à ma connaissance, aucun ne fait le boulot.
Il me reste à améliorer l'expression pour cibler le tag.
Modifié par phil_zic (12 Nov 2019 - 13:50)
L'expression suivante supprime les tags <a> mais garde leurs contenus :
$recherche = '@</?a[^>]*>@';

L'expression suivante supprime les tags <a> y compris leurs contenus :
$recherche = '@<a[^>]*>.*?</a>@';

Si cela ne marche pas, donne moi la page HTML à nettoyer, j'essaierai sur https://regex101.com
Modifié par bazooka07 (13 Nov 2019 - 15:41)
Bonjour

Merci, j'avais fini par trouver ça, qui fonctionne (je veux garder le contenu mais retirer le lien) :

function sans_tag($texte) {
   $recherche = "{<a[^>]*>|<\/a>}";
   $remplacement = "";
   $texte = preg_replace($recherche, $remplacement, $texte); 
   return $texte;
}

Modifié par phil_zic (15 Nov 2019 - 09:21)
Modérateur
Attention tout de même,

ton expression supprimera tous les

<a> </a>
<article>
<applet>
<abbr>
<aside>
<area>
<audio>

ps: ce sera toujours plus propre et robuste de se servir du dom.
phil_zic a écrit :
Bonjour

Merci, j'avais fini par trouver ça, qui fonctionne (je veux garder le contenu mais retirer le lien) :

function sans_tag($texte) {
   $recherche = "{<a[^>]*>|<\/a>}";
   $remplacement = "";
   $texte = preg_replace($recherche, $remplacement, $texte); 
   return $texte;
}

Je suis surpris par l'utilisation de "{...}" comme délimiteurs dans une expression régulière, la norme étant d'utiliser le même caractère, par exemple "/.../" ou "@...@". Smiley eek
Je n'ai pas trouvé de référence à une telle utilisation.
Commentaires?
@kustolovic
C'est vrai, je n'y avait pas pensé car cela ne joue pas dans mon utilisation.
Le but est de supprimer les liens internes sur certains éléments lors de la création de résumés. Les filtres natifs de spip suppriment la mise en forme, que je désire garder pour des questions de lisibilité, mais la méthode trouvée pour réduire un texte en gardant la mise en forme conserve les liens. Ça provoque une imbrication de balises <a> liée à .mediabox lors de la présence d'images.
Je n'ai pas trouvé de solution utilisant le dom, qui me satisfasse (!) sur les plans accessibilité, lisibilité et esthétique.
d'où l'utilisation d'une fonction...

Ceci devrait résoudre le problème en cas de besoin:

   $recherche = "{<a\s[^>]*>|<\/a>}";


@PapyJP
Oui, c'est étonnant en effet. Je m'étais posé la question. Pas d'explication trouvée, mais ça fonctionne... alors j'ai gardé!
bacasable a écrit :
Concernant les délimiteurs c'est précisé ici :

Il est également possible d'utiliser les délimiteurs utilisant les crochets où les crochets ouvrants et fermants sont respectivement les délimiteurs de début et de fin. (), {}, [] and <>sont tous des styles de crochets valides.

https://www.php.net/manual/fr/regexp.reference.delimiters.php

Merci de cette réponse, ça me semble intéressant pour améliorer la lisibilité du code.
function sans_tag($texte) {
 return preg_replace('#<a\b[[^>]*>(.*?)</a>#', "$1", $texte);
}

Inutile de mettre "-1", c'est la valeur par défaut
\b précise une bordure de mot "<a" matche mais pas "<article" et Cie
*? pour éviter la gourmandise. Les expressions régulières sont plus voraces que les piranhas Smiley lol
Mauvaise idée que d'employer les couples "{}", "()", "[]". Smiley fache
Ils semblent dans les expressions régulières