11 votes

comment supprimer une balise et son contenu en utilisant une expression régulière ?

$str = 'une balise de texte contenu plus de texte ' ;

Mes questions sont les suivantes : Comment récupérer le contenu tag <em>contents </em> qui se situe entre <MY_TAG> .. </MY_TAG> ?

Et

Comment enlever <MY_TAG> et son contenu de $str ?

J'utilise PHP.

Merci.

12voto

Gumbo Points 279147

Si MY_TAG ne peuvent pas être imbriqués, essayez ceci pour obtenir les correspondances :

preg_match_all('/<MY_TAG>(.*?)<\/MY_TAG>/s', $str, $matches)

Et pour les supprimer, utilisez preg_replace à la place.

2voto

Kris Points 11892

Il ne faut pas utiliser d'expressions régulières pour cela. Une bien meilleure solution serait de charger votre contenu dans un fichier DOMDocument et travailler dessus en utilisant l'arbre DOM et les méthodes DOM standard :

$document = new DOMDocument();
$document->loadXML('<root/>');
$document->documentElement->appendChild(
    $document->createFragment($myTextWithTags));

$MY_TAGs = $document->getElementsByTagName('MY_TAG');
foreach($MY_TAGs as $MY_TAG)
{
    $xmlContent = $document->saveXML($MY_TAG);
    /* work on $xmlContent here */

    /* as a further example: */
    $ems = $MY_TAG->getElementsByTagName('em');
    foreach($ems as $em)
    {
        $emphazisedText = $em->nodeValue;
        /* do your operations here */
    }
}

1voto

NickC Points 13729

Bien que la seule façon totalement correcte de procéder soit de ne pas utiliser d'expressions régulières, vous pouvez obtenir ce que vous voulez si vous acceptez que cela ne gère pas tous les cas particuliers :

preg_match("/<em[^>]*?>.*?</em>/i", $str, $match);
// Use this only if you aren't worried about nested tags.
// It will handle tags with attributes

Et

preg_replace(""/<MY_TAG[^>]*?>.*?</MY_TAG>/i", "", $str);

1voto

BlackFire Points 368

J'ai testé cette fonction, elle fonctionne aussi pour les balises imbriquées, utilisez true/false pour exclure/inclure vos balises. Trouvé ici : https://www.php.net/manual/en/function.strip-tags.php

<?php
function strip_tags_content($text, $tags = '', $invert = FALSE) {

  preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags);
  $tags = array_unique($tags[1]);

  if(is_array($tags) AND count($tags) > 0) {
    if($invert == FALSE) {
      return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text);
    }
    else {
      return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text);
    }
  }
  elseif($invert == FALSE) {
    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
  }
  return $text;
}

// Sample text:
$text = '<b>sample</b> text with <div>tags</div>';

// Result for:
echo strip_tags_content($text);
// text with

// Result for:
echo strip_tags_content($text, '<b>');
// <b>sample</b> text with

// Result for:
echo strip_tags_content($text, '<b>', TRUE);
// text with <div>tags</div>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X