2009-09-01 7 views
6

Dire que j'ai le texte suivantPHP expression régulière pour supprimer les balises dans le document HTML

..(content)............. 
<A HREF="http://foo.com/content" >blah blah blah </A> 
...(continue content)... 

Je veux supprimer le lien et je veux supprimer la balise (tout en gardant le texte entre les deux). Comment puis-je faire cela avec une expression régulière (puisque les URL seront tous différents)

Une grande partie grâce

+0

double possible de [Pouvez-vous donner quelques exemples des raisons pour lesquelles il est difficile d'analyser XML et HTML avec une regex?] (Http://stackoverflow.com/questions/701166/can-you-provide-some -exemples-de-pourquoi-il-est-difficile-d'-analyser-xml-et-html-avec-une-rege) –

+0

duplication possible de [étiquettes ouvertes de correspondance RegEx à l'exception des étiquettes autonomes XHTML] (http: // stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

Répondre

-2

utilisation str_replace

+0

Comment devrait-il faire cela avec différentes chaînes href? – Rufinus

+0

(Je ne suis pas le downvoter, mais comme il semble qu'il n'expliquera pas pourquoi il downvoted, ce qui n'est pas très utile, devrais-je ajouter, devinez pourquoi ...) Avec str_replace, vous ne pouvez pas spécifier un "pattern", est un problème, car l'URL peut changer; et même si cela ne change pas, vous devrez utiliser deux appels à str_replace: un pour la balise openig, et un pour la fermeture, car vous voulez conserver ce qui est entre. –

3

Pas assez, mais fait le travail:

$data = str_replace('</a>', '', $data); 
$data = preg_replace('/<a[^>]+href[^>]+>/', '', $data); 
+0

strip_tags fonctionne bien lorsque HTML est bien formé. J'ai eu le problème avec un fichier HTML où les attributs manquaient de guillemets, et cette approche a fonctionné. Merci! – FrancescoR

13

Cette volonté supprimer tous les tags:

preg_replace("/<.*?>/", "", $string); 

Cela supprimera tout le <a> tags:

preg_replace("/<\\/?a(\\s+.*?>|>)/", "", $string); 
+0

ne va-t-il pas effacer toutes les étiquettes? –

+2

n'est-ce pas ce qui a été demandé? – nickf

+0

parfait! direct et strict. – tfont

4
<?php 
//example to extract the innerText from all anchors in a string 
include('simple_html_dom.php'); 

$html = str_get_html('<A HREF="http://foo.com/content" >blah blah blah </A><A HREF="http://foo.com/content" >blah blah blah </A>'); 

//print the text of each anchor  
foreach($html->find('a') as $e) { 
    echo $e->innerText; 
} 
?> 

Voir PHP Simple DOM Parser.

0

J'utilise ceci pour remplacer les points d'ancrage avec une chaîne de texte ...

function replaceAnchorsWithText($data) { 
     $regex = '/(<a\s*'; // Start of anchor tag 
     $regex .= '(.*?)\s*'; // Any attributes or spaces that may or may not exist 
     $regex .= 'href=[\'"]+?\s*(?P<link>\S+)\s*[\'"]+?'; // Grab the link 
     $regex .= '\s*(.*?)\s*>\s*'; // Any attributes or spaces that may or may not exist before closing tag 
     $regex .= '(?P<name>\S+)'; // Grab the name 
     $regex .= '\s*<\/a>)/i'; // Any number of spaces between the closing anchor tag (case insensitive) 

     if (is_array($data)) { 
      // This is what will replace the link (modify to you liking) 
      $data = "{$data['name']}({$data['link']})"; 
     } 
     return preg_replace_callback($regex, array('self', 'replaceAnchorsWithText'), $data); 
    } 
+0

Ou vous pourriez faire [ceci] (http://stackoverflow.com/a/758820/1057527) ... – machineaddict

1

strip_tags() peut également être utilisé.

Veuillez consulter les exemples here.

+1

Bienvenue dans Stack Overflow! Bien que cela puisse répondre à la question, [il serait préférable] (http://meta.stackexchange.com/q/8259) d'inclure les parties essentielles de la réponse ici, et de fournir le lien pour référence. – senderle

+0

@senderle, je suis généralement d'accord avec vous mais cette fois ce n'est pas une page externe, c'est la page officielle de PHP.net qui décrit la fonction 'strip_tag' et copier des exemples de code ici n'est pas nécessaire;) Cette réponse contient déjà le nom de la fonction son lien-référence. – Wh1T3h4Ck5

0
$pattern = '/href="([^"]*)"/'; 
Questions connexes