我正在使用一个function
来缩短单词,但我真正想要的是在function
缩短字符串中创建,而不缩短单词
function getSubString($string, $length=NULL){
//Si no se especifica la longitud por defecto es 50
if ($length == NULL)
$length = 15;
//Primero eliminamos las etiquetas html y luego cortamos el string
$stringDisplay = substr(strip_tags($string), 0, $length);
//Si el texto es mayor que la longitud se agrega puntos suspensivos
if (strlen(strip_tags($string)) > $length)
$stringDisplay .= '...';
return $stringDisplay;
}
//Veamos la ejecución de la misma.
$texto = "Este es un acortador de palabras, y yo deseo ser un acortador de cadenas no de palabras";
echo '<span>'.getSubString($product).'</span>';
打印的结果如下:
这是一款短发...
使用浏览器的开发人员工具检查源代码时,会显示以下内容:
<span>Este es un acortador de palabras, y yo deseo ser un acortador de cadenas no de palabras</span>
更新
在得到了这么多非常有趣的答案但不幸的是都失败了。
我想出了使用jQuery分隔单词然后加入它的想法,例如我们将限制从任何文本中显示的字符,以以下文本*“php 7 basic”10
为例,结果将是以下:
php 7...
用浏览器的开发者工具检查输出会显示如下:(不是我想的那样)但更理想
<h2 id="result">php 7...<h2 id="original" style="display: none;"> basic</h2></h2>
何为理想?
因为这样以后它不会在搜索引擎中显示不完整的文本,现在如果我们删除display:none;
它,它将显示:
php 7 ...基本
它是完美的,但有两个问题:
它正在添加
id
到标签中h2
,由于要修剪几个元素,这对于正确验证 HTML 无效,HTML 验证文档说不应有多个id
同名内容,解决方案是迁移id
class
文章中的 jQuery 代码以使用class
其.each()
jQuery 函数。第二个错误是它仅适用于包含 的单个元素,
id="original"
如果我在同一个文档中添加多个元素,它只会缩短第一个元素,而其余元素不会。
$(function() {
var maxlength = 10;
var dots = $('#original').text().length>maxlength?'...':'';
var hello = $('#original').text().length>maxlength?$('#original').text().substring(0,maxlength).replace(/\W\w+\s*(\W*)$/, '$1'):$('#original').text();
$('#original').before('<h2 id="result">'+hello+dots+'</h2>')
$('#original').text($('#original').text().substring(hello.length))
.css('display','none')
.appendTo('#result');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h2 id="original">php 7 basic</h2>
<h2 id="original">Otro texto de otro contenedor</h2>
<h2 id="original">Otro texto de otro contenedor dos</h2>
在 javascript(jQuery) 部分中,我将其更改
('#original')
为 this$('.original')
但它不起作用,当进行这些更改时,第一个内容被重复,其余内容被忽略,可以在以下链接中看到https://jsfiddle.net/ mrfndefx/
一个解决方案是使用wordwrap:
也许应该进行诸如比较是否为 < (70-3) 之类的调整(三个是针对三个连续点),但是 wordwrap 函数会用空格来切割句子...所以你不需要循环,它会给你带来问题。
文档: http: //php.net/manual/es/function.wordwrap.php
你的想法是不会实现的,
PHP
因为你是在服务器端操作它,你必须使用几个变量,一个显示修剪的,另一个显示完整的字符串,然后你必须在客户端操作它......CSS
只需使用以下步骤即可完成许多步骤:text-overflow: ellipsis;
例子:
编辑:(根据评论)
如果要使用效果
Udemy
必须使用属性-webkit-line-clamp
(caniuse.com
)如果您使用的浏览器支持该属性,则不会有问题,请尝试在 FF 中观看 Udemy,您会发现效果消失了……但如果没有解决方案,我们就不会成为操作系统为了它。
最好说 a
Fallback
,因为我们检查它是否支持-webkit-line-clamp
(@supports
... and YES ...@supports
它在 (旧) IE 浏览器中不受支持),如果它不支持-webkit-line-clamp
,我们在文本上放置渐变效果模拟相同的消失...否则显示省略号(...)
在纯
CSS
:另一个例子是使用一点
JS
(原始代码),这里我们修剪它以指示所需的长度,而不在单词中间修剪,然后添加一个类似省略号的链接以显示其余文本:前段时间我实现了以下函数来将字符串修剪到一定长度,尊重整个单词,你可以包含一段 html,它还检查省略号前面没有其他标点符号。
如果您要使用您的代码和 34 个字符的长度对其进行测试:
你会得到正确的结果:
希望这可以帮到你。问候。
版:
如果您打算显示以上内容但能够访问完整内容,您可以通过不同的方式发送它来获取它,其中一种是
data-*
使用您可以通过以下方式访问的属性jQuery
:您可以使用以下方式访问其
data-contenido
内容span
:编辑2:
如果你想要显示裁剪,但文本是完整的,你可以做我做的同样的事情,但相反:
然后用
jQuery
“修剪”字符串,显示修剪而不是内容:如果是 SEO 问题,则标记内容是完整的字符串,即使修剪后的字符串稍后会被操作和放置。
编辑3:
您可以使它更简单,只需将字符串的长度作为数据修剪发送,并让 jQuery 在 PHP 端进行修剪:
string_cut 的第三个参数是一个空字符串,以防止它添加省略号。
干杯!
事实是,您的疑问对我来说似乎很好奇,我想我了解以下内容:
Basado en estas premisas, descartamos PHP como solución, y teniendo en cuenta que no deseas incrustar etiquetas dinámicamente parece que la solución mas viable es a través de CSS, pero debido a que quieres controlar el numero de caracteres máximo a visualizar por si solo CSS es insuficiente. Así que te puedo sugerir la siguiente alternativa:
Tengo claro que es posible optimizar lo anterior pero trato de mostrarte la idea de manera sencilla. El uso de la pseudoclase
:after
no requiere de incrustar mas contenido al rededor de tus párrafos y al ser dinámico puedes manipular el texto que te muestra.Propuesta basada en el algoritmo de la pregunta
Espero que te sea de utilidad.
Te voy a poner dos métodos equivalentes, uno para PHP y el otro para JavaScript. La idea sería usar
strrpos
en PHP olastIndexOf
en JavaScript y el resultado final será el mismo en ambos casos, aunque quizás sería mejor hacerlo en PHP para evitar las consecuencias de hacerlo en JavaScript (un flashazo de texto antes de cortarse).PHP:
strrpos
La función
strrpos
devuelve la posición de la última ocurrencia del carácter especificado. A diferencia destrpos
(que devuelve la primera ocurrencia) una ventaja destrrpos
es que permite buscar desde el final de la cadena y no sólo desde el principio. Esto se hace poniendo un número negativo como offset.Aquí te dejo una pequeña función de cómo sería:
El script anterior dará como resultado:
Ahora podrías hacer un ejemplo más elaborado que en lugar de mandar la cadena recortada mande toda la cadena y se esconda una parte con CSS (aunque siga ahí por lo que los buscadores la indexarán).
Los estilos serían algo como esto (los puedes ver funcionando con más detalle en el ejemplo de JavaScript):
Y el PHP se vería así:
JavaScript:
lastIndexOf
Podrías usar JavaScript y la función
lastIndexOf
para encontrar la última posición que es un espacio en blanco antes de una posición dada. Con eso ya sabrás por dónde tienes que romper la cadena si hace falta.Una vez rota la cadena entre lo que se debe mostrar y no mostrar, puedes crear dos elementos:
::after
mostrará una elipsis (...)font-size: 0
quedará invisible.Algo como esto (en JavaScript puro):
Como los pseudo-elementos no son seleccionables pero los elementos con tamaño 0 sí lo son (aunque no estén visibles), entonces al seleccionar y copiar el texto de arriba te estarán copiando las cadenas originales.
O si lo quieres con jQuery, podrías hacerlo así:
您正在定义
$descripcion
之后for
并且应该在之前:当您进行数据库查询时,请尝试在
for
.我将给你留下一个我不久前尝试过的例子,它可以缩短字符串而不削减单词,这就是我理解你在你的例子中想要的。
一个可能的例子:
结果:
我留下了这个函数,它用一个简单的正则表达式缩短了对单词的尊重:
让我们做一些测试:
让我们切
5
:结果:
让我们切
15
:结果:
来源:PHP:截断文本
还有其他您可能感兴趣的截断函数。
如果您所追求的是严格的客户端文本渲染,您可以通过创建一个 css 类并将其应用于您想要截断的文本(如果它们太长)来实现这一点。
如果这太“僵化”,您可以使用 Clamp.js库的替代方案,您可以在其中操作 HTML,如下所示
Hoy justo tuve que resolver este mismo problema y lo hice con este plugin de jQuery:
http://dotdotdot.frebsite.nl