2009-09-01 18 views
17

A pesar de haber usado PHP durante años, nunca aprendí a usar expresiones para truncar cadenas correctamente ... ¡lo cual ahora me está mordiendo en la parte trasera!¿Cómo eliminar el texto entre las etiquetas en php?

¿Alguien me puede ayudar a truncar esto? Tengo que cortar la parte de texto de la url, convirtiendo

<a href="link.html">text</a> 

en

<a href="link.html"></a> 

Respuesta

29
$str = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $str) 
+0

Mientras esto funciona, generalmente no desea analizar HTML con expresiones regulares. La respuesta de Karim podría ser preferible. – Konerak

6

¿Qué pasa algo como esto, teniendo en cuenta que puede ser que desee volver a utilizarlo con otros href s:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a[^>]*>).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

, que pueden ayudarle:

string '<a href="link.html"></a>' (length=24) 

(¿Considero que cometió un error tipográfico en el PO?)


Si no es necesario para que coincida con cualquier otro href, podría utilizar algo como:

$str = '<a href="link.html">text</a>'; 
$result = preg_replace('#(<a href="link.html">).*?(</a>)#', '$1$2', $str); 
var_dump($result); 

que también conseguirá:

string '<a href="link.html"></a>' (length=24) 


Como nota al margen: para HTML más complejo, no intente utilizar expresiones regulares: funcionan bien para este tipo de situación simple, pero para una porción de HTML de la vida real, realmente no ayudan, en los géneros l: HTML no es lo suficientemente "regular" como para ser analizado por los regexes.

1

Usted podría utilizar subcadena en combinación con stringpos, apesar de esto no es un enfoque muy agradable.

Comprobar: PHP Manual - String functions

Otra forma sería escribir una expresión regular para que coincida con sus criterios. Pero para resolver su problema rápidamente, las funciones de cadena harán ...

EDITAR: He subestimado a la audiencia. ;) Seguir adelante con las expresiones regulares ... ^^

14

Usando SimpleHTMLDom:

<?php 
// example of how to modify anchor innerText 
include('simple_html_dom.php'); 

// get DOM from URL or file 
$html = file_get_html('http://www.example.com/'); 

//set innerText to null for each anchor 
foreach($html->find('a') as $e) { 
    $e->innerText = null; 
} 

// dump contents 
echo $html; 
?> 
+2

Sin ofender, pero esta respuesta tiene 8 años, y nadie ha notado que esta respuesta es incorrecta y no funciona. El ciclo foreach no tiene ningún efecto cuando simplemente hace eco del '$ html'. No puedo creer que haya recibido tantos votos y que nadie lo haya probado realmente. –

1

Sólo utilice strip_tags(), que deshacerse de las etiquetas y la izquierda sólo el texto deseado entre ellos

0

Usted no es necesario capturar las etiquetas ellos mismos. Solo apunte al texto entre las etiquetas y reemplácelo con una cadena vacía. Súper simple.

Código: (Demo)

$string='<a href="link.html">text</a>'; 
echo preg_replace('/<a[^>]*>\K[^<]*/','',$string); 
// the opening tag--^^^^^^^^ ^^^^^-match everything before the end tag 
//       ^^-restart fullstring match 

Salida:

<a href="link.html"></a> 

o en casos marginales cuando el texto del enlace contiene una <, utilice esto: ~<a[^>]*>\K.*?(?=</a>)~

Esto evita el gasto de capturar grupos usando un cuantificador perezoso, la cadena completa reiniciando \K y un "lookahead".

Cuestiones relacionadas