Функция, чтобы отрезать string из-за слов

Следующая функция отрезает string, только нужно вводить в компьютер текст, начало и конец.

Функция - следующая:

 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);
};

Функция функционирует довольно почти всегда, но у нее нет созерцаемый каких-то случаев и мне хотелось бы, что они помогли мне.

Это случаи:


  1. Если не существует последнее место

для следующего текста:

"PayPal, твой ввод под международный рынок" (цепь 44 символов)

Ничего не возвращай, для функции:

splitbywords("PayPal, tu entrada al mercado internacional",0,40)

И разум состоит в том, что не находит последнее место после длины 40

s.indexOf(' ', length)
  1. Что не возвратил запятую","

Также я хочу, чтобы он не отрезал текст после запятой, и проблема находится в той же линии:

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

=====================

EDITO2: Код остается так:

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>
1
задан 24.01.2017, 16:05
0 ответов

Сначала, я думаю, что был бы более практическим для этого случай использовать substring вместо substr.

Метод substring он получает субцепь, где конец (индекс) определен вторым параметром. С другой стороны, в методе substr, второй параметр определяет количество символов, которое нужно брать с начального положения.

Я вижу, что ты делаешь вычислениями достаточно inncesarios. Например, в проблеме, где индекс к концу преодолевает размер текста, по умолчанию, функция substring по умолчанию возврати с начала, до конца текста. Проблема запятой, смоги быть решенным только делая условного:

if (text.chartAt(end - 1) === ',') {
  _end--;
}

Menoramos единица, потому что метод substring он возвращает тебя с X до N - 1.

/**
 * Divide un texto dada un inicio y un final.
 * Si el final es una coma, se excluye meno-
 * rando una unidad al final.
 */
function extract (text, start, end) {
  let _end = end;
  if (text.charAt(end - 1) === ',') {
    _end--;
  }
  return text.substring(start, _end);
}

let text1 = "Hola amigos ¿como están?";
let text2 = "Hola Julio, estoy bien";

console.log('Prueba 1: de 0 a 10: ', extract(text1, 0 , 10));
console.log('Prueba 2: de 0 a 20: ', extract(text1, 0 , 20));
console.log('Prueba 3: de 0 a 10: ', extract(text2, 0 , 10));
console.log('Prueba 4: de 0 a 15: ', extract(text2, 0 , 15));

Также ты можешь играть с регулярными выражениями, чтобы обнаруживать или заменять такие некие символы как запятые, место, и т.д. Останься в твою креативность.

0
ответ дан 03.12.2019, 17:31
  • 1
    Не, если OP хотел оставить слова в половину или нет... –  24.01.2017, 15:20
  • 2
    Ты имеешь razó n, я верю в то, что extract serí на лучшее имя (суффикс " Text" в этом случае я не думаю, что он необходим, потому что OP использует funció n в прототипе объекта, который возможно работал бы с текстами). –  24.01.2017, 15:24
  • 3
    Привет @guzgarcia, Спасибо за ответ, но ты отрезаешь символы и я хочу отрезать слова в твоем доказательстве 1 2 и 4, конечное слово отрезано, и не то, что я жду –  24.01.2017, 15:26
  • 4
    Когда ты говоришь " cortar" , ¿ está s говоря bá sicamente, что ты хочешь скрывать эти слова, или что ты хочешь использовать их как ссылка, чтобы знать с dó nde начинать извлекать? –  24.01.2017, 15:27
  • 5
    использовать как ссылка, чтобы уметь начинать извлекать докуда –  24.01.2017, 15:30

Ты мог бы использовать search чтобы делать поиски используя RegExp.

  • Как в метод search ему не может показывать его один offset (откуда начинать искать, мы используем .substr(offset), чтобы отрезать string и начинать поиски с вышеупомянутой точки.

  • Благодаря тому, что text.substr(offset).search(re) возврати положение характера в обрезанной цепи, необходимо суммировать offset чтобы исправлять возвращенное положение.

Так например:

var splitbywords = function (text, startFrom, lengthFrom) {
    var len = text.length,
        re = /[ ,.]/, // Buscamos alguno de los siguientes caracteres
        from = (startFrom <= 0) ? 0 : text.substr(startFrom).search(re) + startFrom + 1,
        to = (lengthFrom >= len) ? len : text.substr(lengthFrom).search(re) + lengthFrom;
  
    // Si no encontramos algún caracter
    if (from === -1) {
      from = 0;
    }
    if (to === (lengthFrom -1)) {
      to = len;
    }
    return text.substr(from, to);
};

var string = "Hola amigos ¿como están?"
console.log('"' + splitbywords(string, 0, 10) + '" === "Hola amigos"');
console.log('"' + splitbywords(string, 0, 20) + '" === "' + string + '"');

string = "Hola Julio, estoy bien";
console.log('"' + splitbywords(string, 0, 10) + '" === "Hola Julio"');
console.log('"' + splitbywords(string, 0, 15) + '" === "Hola Julio, estoy"');
1
ответ дан 03.12.2019, 17:31

То же самое, что и ты хочешь сделать, но с регулярным выражением:

$(document).ready(function(){
  $("#dividir").click(function(){
    Dividir($("#texto").val());
  });
});

function Dividir(cadena){
  var regExIn = /(?!='.*')\b[\w']+\b/g;
  var palabras = cadena.match(regExIn);
  MostrarPalabras(palabras);
}

function MostrarPalabras(palabras){
  var lista = "";
  $.each(palabras,function(i,v){
    lista += "<li>" + v + "</li>"
  });
  $("#lista").html('');
  $("#lista").append(lista);
}
<link href="http://getbootstrap.com/dist/css/bootstrap.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Palabras</label>
<textarea class="form-control" id="texto">
Ejemplo, varias palabras.  Con Reg Ex, separar y buscar todas.
</textarea>
<br/>
<button id="dividir" class="btn btn-primary">Dividir</button>
<br/><br/>
<div class="row">
  <ol id="lista">
  </ol>
</div>
1
ответ дан 03.12.2019, 17:31
  • 1
    Превосходный, всех ответов я quedarí в с этой из-за использования expresió n ты отрегулируешь. –  01.02.2017, 22:11

Теги

Похожие вопросы