Substr es sin duda una función muy práctica de PHP que nos permite recortar una cadena de texto e imponer un límite a la misma de una manera sencilla. En algunas ocasiones, resulta que en la cadena de texto hay además, etiquetas HTML; Si se tratara de una cadena estática, podríamos calcular hasta donde cortar, sin embargo en una cadena dinámica no podríamos adivinar en cada caso y terminaríamos con etiquetas sin cerrar.
Y como soy un fiel creyente de que cada problema en programación tiene una solución sencilla, les comparto esta función de parte de un usuario de Stackoverflow.
[codigo]
function substr_tags($code, $limit = 300){
if ( strlen($code) <= $limit ){return $code;}
$html = substr($code, 0, $limit);
preg_match_all ( "#<([a-zA-Z]+)#", $html, $result );
foreach($result[1] AS $key => $value){if ( strtolower($value) == ‘br’ ){unset($result[1][$key]);}}
$openedtags = $result[1];preg_match_all ( «#([a-zA-Z]+)>#iU», $html, $result );
$closedtags = $result[1];
foreach($closedtags AS $key => $value){if ( ($k = array_search($value, $openedtags)) === FALSE ){continue;}
else{unset($openedtags[$k]);}}
if ( empty($openedtags) ){if ( strpos($code, ‘ ‘, $limit) == $limit ){return $html.»…»;} else {
return substr($code, 0, strpos($code, ‘ ‘, $limit)).»…»;}}
$position = 0;$close_tag = «»;
foreach($openedtags AS $key => $value){
$p = strpos($code, (‘'.$value.'>‘), $limit);
if ( $p === FALSE ){$code .= (‘'.$value.'>‘);} else if ( $p > $position ){$close_tag = ‘'.$value.'>‘;$position = $p;}}
if ( $position == 0 ){return $code;}
return substr($code, 0, $position).$close_tag.»…»;
}[/codigo]
Se trata de una función que corta el texto y sin dañar las etiquetas html, bastante simple.
[codigo]//uso
$cadena = «Hola geek <p>soy un texto</p> y me gusta esta página!»;
echo substr_tags($cadena, 22); //retorna «Hola geek <p>soy un te</p>»
[/codigo]
En caso de tener problemas para hacer que funcione (a causa de que wordpress daña los caracteres) pueden ver la demo acá y copiar el código desde ahí mismo.