下面的函数剪切一个字符串,你只需要输入文本,开头和结尾。
功能如下:
Generator.prototype.splitbywords = function (variable, start, length) {
var s = variable,
len = s.length,
posStart = Math.max(0, start == 0 ? 0 : s.indexOf(' ', start)),
posEnd = Math.max(0, length > len ? len : s.indexOf(' ', length));
return s.substr(posStart, posEnd);
};
该功能几乎总是运行良好,但它不涵盖某些情况,我需要您的帮助。
这些是案例:
- 如果最后一个空格不存在
对于以下文本:
“PayPal,您进入国际市场的入口”(44个字符的字符串)
对于函数,它没有返回任何内容:
splitbywords("PayPal, tu entrada al mercado internacional",0,40)
而且原因是它没有找到long 40之后的最后一个空格
s.indexOf(' ', length)
- 不要返回逗号“,”
我也希望它不会在逗号后破坏文本,问题出在同一行:
posEnd = Math.max(0, length > len ? len : s.indexOf(' ', length));
因为我查询的是空格 " "
而不是逗号", "
。我试图通过将此行更改为:
posEnd = Math.max(0, length >= len ? len : (s.charAt(s.substr(posStart, s.indexOf(' ', length)) - 1) = "," ? s.indexOf(', ', length): s.indexOf(' ', length));
但是逗号不断返回,我不明白我做错了什么。
我添加了一些测试:
string = "Hola amigos ¿como están?"
splitbywords(string, 0, 10)
Retorna: "Hola amigos"
CORRECTO
splitbywords(string, 0, 20)
Retorna: ""
PROBLEMA ya que espero que retorne todo el texto
========================
string = "Hola Julio, estoy bien"
splitbywords(string, 0, 10)
Retorna: "Hola Julio,"
PROBLEMA, no quiero que retorne la coma ","
splitbywords(string, 0, 15)
Retorna: "Hola Julio, estoy"
CORRECTO
=======================
EDIT2: 代码如下所示:
function splitbywords(variable, empieza, termina) {
var s = variable+' ', // resuelve problema 1
largo = s.length,
posStart = Math.max(0, empieza == 0 ? 0 : s.indexOf(' ', empieza)),
posEnd = Math.max(0, termina > largo ? largo : s.indexOf(' ', termina)),
cadena = s.substr(posStart, posEnd);
if (cadena.charAt(cadena.length-1) === ',') { //resuelve problema 2
cadena = cadena.substr(0, cadena.length-1);
}
return cadena;
}
function splitbywords(variable, empieza, termina) {
var s = variable+' ',
largo = s.length,
posStart = Math.max(0, empieza == 0 ? 0 : s.indexOf(' ', empieza)),
posEnd = Math.max(0, termina > largo ? largo : s.indexOf(' ', termina)),
cadena = s.substr(posStart, posEnd);
if (cadena.charAt(cadena.length-1) === ',') {
cadena = cadena.substr(0, cadena.length-1);
}
return cadena;
}
let text1 = "PayPal, tu entrada al mercado internacional";
let text2 = "Hola Julio, estoy bien";
document.getElementById("demo1").innerHTML = splitbywords(text1, 0 , 25);
document.getElementById("demo2").innerHTML = splitbywords(text1, 0 , 30);
document.getElementById("demo3").innerHTML = splitbywords(text2, 0 , 8);
document.getElementById("demo4").innerHTML = splitbywords(text2, 0 , 15);
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript splitbywords</h1>
<p>Ejemplos:</p>
<p id="demo1"></p>
<p id="demo2"></p>
<p id="demo3"></p>
<p id="demo4"></p>
</body>
</html>
您可以使用
search
来进行搜索RegExp
。由于该方法
search
无法指示offset
(从哪里开始搜索,我们使用.substr(offset)
, 来剪切string
并从该点开始搜索。由于它
text.substr(offset).search(re)
返回的是修剪后的字符串中字符的位置,因此需要添加offset
来更正返回的位置。例如:
您想要做的同样的事情,但使用正则表达式:
首先,我认为在这种情况下使用
substring
而不是substr
.我看到你做了很多不必要的计算。例如,在结尾的索引超过文本大小的问题中,默认情况下,默认函数
substring
从文本的开头返回到结尾。逗号问题可以通过做一个条件来解决:我们减少一个单位,因为该方法
substring
从X
to返回N - 1
。您还可以使用正则表达式来检测或替换某些字符,如逗号、空格等。这取决于你的创造力。