Eliminar todas las etiquetas html de la cadena php

81

Quiero mostrar los primeros 110 caracteres de una entrada de base de datos. Bastante fácil hasta ahora:

<?php echo substr($row_get_Business['business_description'],0,110) . "..."; ?>

Pero la entrada anterior tiene un código html que ha sido ingresado por el cliente. Entonces muestra:

<p class="Body1"><strong><span style="text-decoration: underline;">Ref no:</span></strong> 30001<strong></stro...

Obviamente no es bueno.

Solo quiero eliminar todo el código html, por lo que necesito eliminar todo entre <y> de la entrada db ENTONCES mostrar los primeros 100 caracteres.

¿Alguna idea de alguien?

Jimbeeer
fuente
entrada y salida de muestra .........
Venkata Krishna

Respuestas:

141

utilizar strip_tags

$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);   //output Test paragraph. Other text

<?php echo substr(strip_tags($row_get_Business['business_description']),0,110) . "..."; ?>
Yogesh Suthar
fuente
¿Por qué no funciona? :( Estoy usando: data = htmlentities ($ description2, ENT_QUOTES, 'UTF-8');, strip_tags ($ data) y no funciona
Resolví con uft8_encode :), parece que strip_tags no puede anular htmlentities
¿Esto también protegería la página de ataques de scripting xss?
thekucays
1
@delive ¿Por qué diablos corría htmlentitiesy luego strip_tags? Eso frustra totalmente el propósito.
Captain Hypertext
Es posible que no bloquee ciertos tipos de JavaScript. No espere milagros de esta función.
PJ Brunet
18

Utilice la función strip_tags () de PHP .

Por ejemplo:

$businessDesc = strip_tags($row_get_Business['business_description']);
$businessDesc = substr($businessDesc, 0, 110);


print($businessDesc);
Creaciones EM
fuente
2
Esto primero tomará los 100 caracteres y luego eliminará las etiquetas html. Pero creo que OP quiere eliminar primero las etiquetas html y luego substr 100 caracteres.
Yogesh Suthar
1
@YogeshSuthar Muy cierto, editaré la respuesta ahora, gracias por señalar eso. - Hecho
EM-Creations
11

¡Elimine todas las etiquetas HTML de la cadena PHP con contenido!

Supongamos que tiene una cadena que contiene una etiqueta de anclaje y desea eliminar esta etiqueta con contenido, entonces este método será útil.

$srting = '<a title="" href="https://stackoverflow.com/index.html"><b>Some Text</b></a>
Lorem Ipsum is simply dummy text of the printing and typesetting industry.';

echo strip_tags_content($srting);

function strip_tags_content($text) {

    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
    
 }

Salida:

Lorem Ipsum es simplemente texto de relleno de la industria de la impresión y la composición tipográfica.

Muhammad Shahzad
fuente
1
Casi. La sección 12.1.2.2.4 de WhatWG dice que </script >es una etiqueta final válida, pero la expresión regular no la maneja. Debería ser </\1\s*>o algo así.
obispo
6

use esta expresión regular: /<[^<]+?>/g

$val = preg_replace('/<[^<]+?>/g', ' ', $row_get_Business['business_description']);

$businessDesc = substr(val,0,110);

de tu ejemplo debería quedar: Ref no: 30001

Maxim Shoustin
fuente
5
strip_tags está ahí, ¿por qué regex?
1
No estoy completamente seguro, pero creo que no detectará las etiquetas de cierre automático que contengan espacios en blanco: <br />o <special />. También creo que esto no tiene <b<b>></</b>>en cuenta los hacks similares .
Kaiser
Creo Kaiser se refería a esta respuesta, nostrip_tags
pjmil
Esta es una mejor solución que PHP strip_tag. PHP strip_tag eliminará tanto la apertura como el cierre de HTML Script Element. Sin embargo, si su usuario solo coloca el Elemento de secuencia de comandos HTML de apertura, PHP strip_tag no lo eliminará. Entonces, es muy probable que su página web se muestre completamente mal. Probado con PHP versión 5.6.19. Esta pequeña expresión regular corrigió esas etiquetas HTML parciales que pueden causar problemas que strip_tag pasará por alto. ¡Bravo!
ptay el
El problema es que a veces el usuario escribe un HTML inválido, por ejemplo, <div Nombre del cliente <div>hello> </div>, y demandar strip_tag eliminará todo ... y algunos queremos una forma más reservada, así que iría con expresiones regulares ... "Debido a que strip_tags () en realidad no valida el HTML, las etiquetas parciales o rotas pueden resultar en la eliminación de más texto / datos de lo esperado".
Miguel
2

Para mi esta es la mejor solución.

function strip_tags_content($string) { 
    // ----- remove HTML TAGs ----- 
    $string = preg_replace ('/<[^>]*>/', ' ', $string); 
    // ----- remove control characters ----- 
    $string = str_replace("\r", '', $string);
    $string = str_replace("\n", ' ', $string);
    $string = str_replace("\t", ' ', $string);
    // ----- remove multiple spaces ----- 
    $string = trim(preg_replace('/ {2,}/', ' ', $string));
    return $string; 

}
David G.
fuente
0

En laravel puedes usar la siguiente sintaxis

 @php
   $description='<p>Rolling coverage</p><ul><li><a href="http://xys.com">Brexit deal: May admits she would have </a><br></li></ul></p>'
 @endphp
 {{  strip_tags($description)}}
Krishnamoorthy Acharya
fuente
0

<?php $data = "<div><p>Welcome to my PHP class, we are glad you are here</p></div>"; echo strip_tags($data); ?>

O si tiene un contenido proveniente de la base de datos;

<?php $data = strip_tags($get_row['description']); ?> <?=substr($data, 0, 100) ?><?php if(strlen($data) > 100) { ?>...<?php } ?>

Mykel2503
fuente
0
$string = <p>Awesome</p><b> Website</b><i> by Narayan</i>. Thanks for visiting enter code here;
$tags = array("p", "i");

echo preg_replace('#<(' . implode( '|', $tags) . ')(?:[^>]+)?>.*?</\1>#s', '', $string);

Prueba esto

Ajeet kumar
fuente