Нужен Скрипт для форматирования текста

DarkHorse
На сайте с 29.12.2013
Offline
45
1701

Коллеги, добрый вечер!

Прошу помощи.

Имеется вот такой текст:

консалт лтд
консалт парадигма
консалт премиум
консалт продакшн
консалт строй
консалт

Необходимо привести данный текст вот в такой вид:

консалт лтд
консалт парадигма
консалт премиум
консалт продакшн
консалт строй
консалт -лтд -парадигма -премиум -продакшн -строй

То есть к слову (или словосочетанию), имеющему полное вхождение в какую либо строку (в данном случае "консалт") необходимо добавить остаток данной строки за вычетом "полного вхождения". Желательно добавив знак минус ("-") перед каждым словом.

Подскажите, может есть какой-нибудь скрипт, который решит мою проблему, а то уже голову сломал как ее решить.

Вперед в бой, а битва все решит!
[umka]
На сайте с 25.05.2008
Offline
456
#1

Можете словами описать отличительные признаки для слова (или словосочетания), имеющего полное вхождение? :)

Лог в помощь!
DarkHorse
На сайте с 29.12.2013
Offline
45
#2

Давайте попробую.

6-ая строка полностью входит в строки 1, 2, 3, 4, 5, 6.

Можно ли какими-либо способами дать машине задачу:

1. Найди строки (в нашем случае 1, 2, 3, 4, 5), имеющие частичное вхождение целой строки (6).

Фото сверху.

2. Скопируй у каждой полученной строки весь текст, идущий следом за "полным вхождением" (в нашем случае текст в строках 1, 2, 3, 4, 5)

3. Вставь скопированный текст в строку с полным вхождением, поставив знак "-" (минус) перед каждым скопированным словом:

Вот.

[umka]
На сайте с 25.05.2008
Offline
456
#3

То есть, это слово или максимально длинное словосочетание, с которого начинаются все строки?

domen4you
На сайте с 08.03.2013
Offline
53
#4
DarkHorse:
Подскажите, может есть какой-нибудь скрипт, который решит мою проблему, а то уже голову сломал как ее решить.

а как вы её пытаетесь решить? Найти готовый скрипт? вряд ли такой есть.

Скиньте пример такого файла с данными.

wwwwww
На сайте с 29.04.2011
Offline
195
#5

Создаете на своем компьютере файл с расширением .htm, затем копируете в него ниже приведенный код и открываете в браузере (проверял в Firefox, Chrome). Вставляете свои данные (список фраз), нажимаете кнопку и получаете результат.


<textarea id="t1" rows="20" cols="60">Исходный набор
</textarea>
<br>
<button id="btn1" onClick="proc()">Go</button>
<br><br>
<textarea id="t2" rows="20" cols="60">Результат
</textarea>
<script>

function proc(){
lines = document.getElementById('t1').value.split(/\r\n|\r|\n/g);
lines1 = document.getElementById('t1').value.split(/\r\n|\r|\n/g);

laststr = lines1[lines1.length-1];
for(i=0; i < lines1.length-1; i++){
lines1 = lines1.replace(laststr, '');
lines1 = lines1.replace(/ /g, ' -');
}
for(i=0; i < lines1.length-1; i++){
laststr += lines1 ;
}
lines[lines.length-1] = laststr;
lines = lines.join("\r\n");
document.getElementById('t2').value = lines;
}
</script>

Видишь? Свободная подпись.
J
На сайте с 20.02.2014
Offline
120
jkm
#6

Или так


<textarea id="t1" rows="20" cols="60">Исходный набор
</textarea>
<br>
<button id="btn1" onClick="proc()">Go</button>
<br><br>
<textarea id="t2" rows="20" cols="60">Результат
</textarea>
<script>

function proc(){
lines = document.getElementById('t1').value.replace(/^\s*(.+)\s+\S+\s*$(\s*\1\s+\S+\s*$)*\s*\1(?=\s*$)/mg,
function(m0, m1){
return m0 + ' -' + m0.replace(new RegExp(m1,'g'), '').trim().replace(/\s+/g, ' -');
});

document.getElementById('t2').value = lines;
}
</script>
DarkHorse
На сайте с 29.12.2013
Offline
45
#7

wwwwww, jkm, Коллеги, огромное спасибо за Ваши скрипты.

Оба скрипта рабочие для данного вопроса, выдают следующее:

Вопрос, заданный в начале данной темы РЕШЕН. Но есть небольшая загвоздка.

Если усложнить задачу. И дать скрипту задачу на несколько фраз, получаем:

При усложнении задачи, скрипт от jkm прошел на 100%. Но, усложним задачу еще чуть-чуть..

Имеем 3 строки:

консалт строй плюс
консалт строй
консалт

Возможно ли как-то видоизменить скрипт, чтобы получить на выходе:

консалт строй плюс
консалт строй -плюс (добавляется слово -плюс, т.к. данная строка (№2) "консалт строй" полностью повторяет и входит целиком в строку №1
консалт -строй -плюс (добавляются слова -строй -плюс, т.к. строка №3 полностью входит в строки №1 и №2)

P.S. возможно решение строки №3 и так:

консалт -строй -плюс -строй

Сейчас, данная задача отображается таким образом:

Буду очень признателен, если найдется решение моей проблемы :)

J
На сайте с 20.02.2014
Offline
120
jkm
#8


<html><body>
<textarea id="t1" rows="20" cols="60">Исходный набор
</textarea>
<br>
<button id="btn1" onClick="proc()">Go</button>
<br><br>
<textarea id="t2" rows="20" cols="60">Результат
</textarea>
<script>

function proc(){

str = document.getElementById('t1').value;
pos = 0;
res = [];
do {
i = 0;
str = str.substr(pos).replace(/^((.+) (?:.+)$(?:\s+\2 (?:.+)$)*)\s+\2(?= *$)/m,
function(m0, m1, m2, offset, s){
i = 1;
pos = offset + m1.length;
res.push(s.substr(0, pos));
return m0 + ' -' + m0.replace(new RegExp("^"+m2,'mg'), '').trim().replace(/\s+-?/g, ' -');
});
} while (i);
document.getElementById('t2').value = res.join('') + str;
}
</script>
</body>
</html>
DarkHorse
На сайте с 29.12.2013
Offline
45
#9

Глубокоуважаемый, jkm!

Большое спасибо за Вашу поддержку в моем вопросе.

Не хочу показаться слишком наглым и настойчивым, просто сам в этом очень-очень плохо разбираюсь, а знакомых специалистов такого уровня у меня совсем нет.

Есть небольшой нюанс.

В данный момент скрипт не обрабатывает промежуточные значения.

--------------------

Задача:

консалт строй плюс
консалт строй

консалт медиа групп
(входит в "консалт", но не входит в "консалт медиа")

консалт медиа

консалт

--------------------

Результат:
консалт строй плюс
консалт строй -плюс

консалт медиа групп
консалт медиа

консалт -строй -плюс -медиа -групп -медиа

--------------------

Очень прошу помочь.

J
На сайте с 20.02.2014
Offline
120
jkm
#10

Сей баг можно объявить фичей :)

Там изначально в шаблоне кусок $\s+ захватывал любое количество подряд идущих пробелов и переносов строк.

В результате текст обрабатывался как если бы пустых строк не было вовсе.

Решается разделением блоков строками с любым символом.

Например:

консалт строй плюс
консалт строй
;
консалт медиа групп
консалт медиа
;
консалт

Вообще, такое поведение легко исправить, заменив $\s+ на \r?\n. Тогда поиск будет останавливаться на пустых строках, как положено.


<html><body>
<textarea id="t1" rows="20" cols="60">Исходный набор
</textarea>
<br>
<button id="btn1" onClick="proc()">Go</button>
<br><br>
<textarea id="t2" rows="20" cols="60">Результат
</textarea>
<script>

function proc(){

str = document.getElementById('t1').value;
pos = 0;
res = [];
do {
i = 0;
str = str.substr(pos).replace(/^((.+) (?:.+)$(?:\r?\n\2 (?:.+)$)*)\r?\n\2(?= *$)/m,
function(m0, m1, m2, offset, s){
i = 1;
pos = offset + m1.length;
res.push(s.substr(0, pos));
regexp = new RegExp("^" + m2.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'), 'mg');
return m0 + m0.replace(regexp, '').trim().replace(/(^|\s+)-?/g, ' -');
});
} while (i);
document.getElementById('t2').value = res.join('') + str;
}
</script>
</body>
</html>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий