11
votes

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

$ str = 'Quelques étiquettes de texte contenu plus de texte';

Mes questions sont: Comment récupérer le contenu Tag Contenu qui est entre ..

et

Comment supprimer et son contenu de $ str ?

J'utilise php.

merci.


2 commentaires

Je me demande combien de fois la réponse suivante est liée à un jour donné: Stackoverflow.com/questions/1732348/...


HTML Parser Blah Blah Blah ... Vous connaissez la perceuse.


5 Réponses :


11
votes

si my_tag ne peut pas être imbriqué, essayez-le pour obtenir les correspondances: xxx

et pour les supprimer, utilisez prg_replace à la place.


4 commentaires

@ user187580: le drapeau s fait le . pauses de la ligne de correspondance. Voir php.net/manual/fr/reference.pcre.pattern.Modificateurs .php


Vous feriez mieux de définir ungredy avec ce modèle si vous pouvez trouver cette balise dans la chaîne plus d'une fois. Sinon, vous constaterez que vous convertissez cette chaîne "c'est a très important définit ligne" dans "Ceci est la ligne"


@Don the ? après le * est exactement le même.


Et j'ai regardé à la bonne réponse et je n'ai pas vu le? modificateur, whoops!



1
votes

Bien que le seul moyen totalement correct de le faire n'est pas d'utiliser des expressions régulières, vous pouvez obtenir ce que vous voulez si vous acceptez cela ne traitera pas tous les cas spéciaux: xxx

et < / p> xxx


0 commentaires

2
votes

Vous ne voulez pas utiliser des expressions régulières pour cela. Une bien meilleure solution serait de charger votre contenu dans un Domdocument et y travailler à l'aide de l'arborescence DOM et Standard DOM Méthodes:

$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 */
    }
}


0 commentaires

13
votes

Pour le retrait, je fini par utiliser simplement ceci:

$str = preg_replace('~<MY_TAG(.*?)</MY_TAG>~Usi', "", $str);


1 commentaires

Bon travail (Y) Travailler bien pour Span E.G $ Ptitle = Preg_replace ('~ ~ USI', "", $ ptitlewithspan);



1
votes

J'ai testé cette fonction, cela fonctionne également pour des balises imbriquées, utilisez true / false pour exclure / inclure vos balises. Trouvé ici: https://www.php.net/manual/fr /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>


0 commentaires