2009-09-01 12 views
6

Dire che ho il seguente testoPHP espressione regolare per rimuovere i tag nel documento HTML

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

voglio eliminare il collegamento e voglio eliminare il tag (pur mantenendo il testo in mezzo). Come faccio a fare questo con un espressione regolare (dal momento che gli URL saranno tutti diversi)

Molto grazie

+0

possibile duplicato di [Potete fornire alcuni esempi del perché è difficile analizzare XML e HTML con una regex?] (Http://stackoverflow.com/questions/701166/can-you-provide-some -esempi-di-perché-è-difficile-da-analizzare-xml-e-html-con-un-rege) –

+0

possibile duplicato di [corrispondenza aperta RegEx ad eccezione dei tag autonomi XHTML] (http: // stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

risposta

-2

uso str_replace

+0

come dovrebbe farlo con diverse stringhe href? – Rufinus

+0

(Non sono il downvoter, ma come sembra non spiegherà perché ha downvoted, che non è così utile, potrei aggiungere, supponiamo perché ...) Con str_replace, non puoi specificare un "pattern", che è un problema, dato che l'URL può cambiare; e anche se non fosse cambiato, dovresti usare due chiamate a str_replace: uno per il tag openig e uno per quello di chiusura, poiché vuoi mantenere ciò che è tra i due. –

3

Non bella, ma non il lavoro:

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

strip_tags funziona bene quando l'HTML è ben formato. Ho avuto il problema con un file HTML in cui agli attributi mancavano le virgolette e questo approccio funzionava. Grazie! – FrancescoR

13

Questa volontà rimuovere tutti i tag:

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

Questo rimuoverà solo il <a> tags: espressioni

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

non cancellerà ogni tag? –

+2

non è quello che è stato chiesto? – nickf

+0

perfetto! diretto e rigoroso. – 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; 
} 
?> 

Vedere PHP Simple DOM Parser.

0

Io lo uso per sostituire le ancore con una stringa di testo ...

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

Oppure potresti farlo [http://stackoverflow.com/a/758820/1057527) ... – machineaddict

1

strip_tags() può anche essere usato.

Vedere gli esempi here.

+1

Benvenuto in Stack Overflow! Mentre questo può rispondere alla domanda, [sarebbe meglio] (http://meta.stackexchange.com/q/8259) per includere qui le parti essenziali della risposta e fornire il link per riferimento. – senderle

+0

@senderle, in genere sono d'accordo con te ma questa volta non è "nessuna" pagina esterna, è la pagina ufficiale di PHP.net che descrive la funzione 'strip_tag' e copiare i campioni di codice qui non è necessario;) Questa risposta contiene già il nome della funzione e il suo link-reference. – Wh1T3h4Ck5

0
$pattern = '/href="([^"]*)"/'; 
Problemi correlati