2009-09-01 15 views
6

Decir que tengo el siguiente textoPHP expresión regular para eliminar las etiquetas HTML en el documento

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

Quiero eliminar el vínculo y quiero eliminar la etiqueta (mientras se mantiene el texto en el medio). ¿Cómo puedo hacer esto con una expresión regular (ya que las direcciones URL ser todos diferentes)

Muchas gracias

+0

posible duplicado de [¿Puede dar algunos ejemplos de por qué es difícil de analizar XML y HTML con una expresión regular?] (Http://stackoverflow.com/questions/701166/can-you-provide-some -examples-of-why-it-is-hard-to-parse-xml-and-html-with-a-rege) –

+0

posible duplicado de [RegEx cerró las etiquetas abiertas excepto las etiquetas autocontenidas XHTML] (http: // stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

Respuesta

-2

uso str_replace

+0

¿cómo debería hacer esto con diferentes cadenas href? – Rufinus

+0

(No soy el que menosprecia, pero como parece que no explicará por qué bajó la votación, lo que no es tan útil, podría añadir, adivine por qué ...) Con str_replace, no puede especificar un "patrón", que es un problema, ya que la URL puede cambiar; e incluso si no cambiara, tendrías que usar dos llamadas a str_replace: una para la etiqueta openig, y otra para la de cierre, ya que quieres mantener lo que está entre ellas. –

3

No es bonita, pero hace el trabajo:

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

strip_tags funciona bien cuando HTML il bien formado. Tuve el problema con un archivo HTML donde faltaban citas de atributos, y este enfoque funcionó. ¡Gracias! – FrancescoR

13

Esta voluntad eliminar todas las etiquetas:

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

Esto eliminará solo elTags:expresiones

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

¿no borrará todas las etiquetas? –

+2

¿No es eso lo que se pidió? – nickf

+0

¡perfecto! directo y estricto – 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; 
} 
?> 

Ver PHP Simple DOM Parser.

0

Lo utilizo para reemplazar los anclajes con una cadena de texto ...

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

O podría hacer [esto] (http://stackoverflow.com/a/758820/1057527) ... – machineaddict

1

strip_tags() también se puede utilizar.

Consulte los ejemplos here.

+1

¡Bienvenido a Stack Overflow! Si bien esto puede responder a la pregunta, [sería mejor] (http://meta.stackexchange.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia. – senderle

+0

@senderle, generalmente estoy de acuerdo contigo, pero esta vez no es "ninguna" página externa, es la página oficial de PHP.net que describe la función 'strip_tag' y no es necesario copiar ejemplos de código;) Esta respuesta ya contiene el nombre de la función y su enlace-referencia. – Wh1T3h4Ck5

0
$pattern = '/href="([^"]*)"/'; 
Cuestiones relacionadas