Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.09.2013, 21:16
Новичок на форуме
Отправить личное сообщение для piterberkut Посмотреть профиль Найти все сообщения от piterberkut
 
Регистрация: 26.09.2013
Сообщений: 2

Регулярка - разбить текст на предложения
Я не силен в регулярных выражениях, а загвоздка в них.. Суть, есть произвольный текст, нужно этот текст разбить на предложения, и обрамить в теги каждое..
Я накатал вот такую регулярку:

jQuery("#text_box").html("<div id='text'>"+text.replace(/(\s+)?([^.!?]+?)([.!?]+|\n|$)/g," $1<translate>$2</translate>$3 ").replace(/\r?\n/g,"<br/>")+"</div>");


пример работы: http://helenbrown.ru/content/3607
но проблема в том, что внутрь тегов не попадают знаки препинания:[.!?] они остаются за пределами тега..
вот надо как-то их туда засунуть, при этом не похерив, структуру текста, переносы всякие.. вот такая не тривиальная задача
Буду очень благодарен за помощь! Уже голову на этом сломал..
Ответить с цитированием
  #2 (permalink)  
Старый 26.09.2013, 22:21
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Я тоже ненавижу регулярки
На вскидку, регулярку даже не трогал.

var text='Привет мир. Куку ? хихи ?';    
alert (  text.replace(/(\s+)?([^.!?]+?)([.!?]+|\n|$)/g," <translate>$2$3</translate> ") );


Замечу что у тебя перенос каретки считается за разделитель вместе с символами пунктуации ([.!?]+|\n|$).
Мне кажется что |/n тебе лучше убрать из регулярки, и заменить /n на <br> вторым реплейсом

З.Ы. Мне кажется регулярку можно проще записать, но лень
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 26.09.2013 в 22:47.
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2013, 22:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109


var text='Привет мир. Куку ? хихи ?';
alert ( "<translate>" + text.replace(/([.!?\n])+(?!\s*$)/g,"$1</translate><translate>")+"</translate>" );
Ответить с цитированием
  #4 (permalink)  
Старый 26.09.2013, 22:59
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Обрати внимание на то как в lingualeo решено.
<context class="" data-tran="я верю, что могу летать">
     <tran>I</tran> 
     <tran>believe</tran> 
     <tran>I</tran> 
     <tran>can</tran> 
     <tran>fly</tran>
     <br>
</context>

Впрочем если слова по отдельности ненужны то можно и не выделять слова тегами.

И все таки меня тревожит что в случае ручного переноса слова "-\n" строчки будут действовать раздельно, несмотря на то они принадлежат одному предложению (ведь ты разделил текст по \n как будто это знак припинания). Хотя если \n тыкать посреди предложения никто не будет то вроде все нормально.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 26.09.2013 в 23:51.
Ответить с цитированием
  #5 (permalink)  
Старый 11.11.2013, 18:16
Новичок на форуме
Отправить личное сообщение для piterberkut Посмотреть профиль Найти все сообщения от piterberkut
 
Регистрация: 26.09.2013
Сообщений: 2

Спасибо! За помощь! Перенос каретки умышленно считается окончанием предложения..

Ситуация усложнилась! Необходимо так же распарсить текст, но при условии что в нем есть теги, загвозка в том что если там есть тег типа <a href="http://yandex.ru">123</a> то скрипт разбивает эту ссылку на два предложения <translate><a href="http://yandex.</translate><translate>.ru">123</a></translate> и вот тут сколько я не бился, не выходит обойти этот момент..

Есть идеи у кого-нибудь?
Ответить с цитированием
  #6 (permalink)  
Старый 15.11.2013, 20:33
Аватар для ANAGAMA
Аспирант
Отправить личное сообщение для ANAGAMA Посмотреть профиль Найти все сообщения от ANAGAMA
 
Регистрация: 29.05.2013
Сообщений: 49

var txt='Ситуация усложнилась? Необходимо так же распарсить! \n Там есть \nтег типа. Тег типа.';
var m=[];
var openTag='<p>';
var closeTag='</p>';

txt.replace(/[\s\S]*?[\.|!|\?]/gm, function(s){
	
	// делайте что угодно с s, можно выкинуть теги.
	
	m.push(openTag + s + closeTag);
	});

console.log( m.join('\n'));


но, я бы в начале выкинул все \n, потом почистил бы от табуляторов, повторяющихся пробелов. заменил бы все пробелы точка|запятая ... на пробел.

В общем если все делать аккуратно возни дофига.

Успехов!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прогкрутка к якорям cOAPerator Общие вопросы Javascript 20 27.08.2013 03:30
нужно заставить одновременно работать слайдер и модальное окно обратной связи kvant355 Javascript под браузер 3 22.07.2013 16:34
Отследить клик по дочернему объекту AllanZ jQuery 3 05.09.2012 12:38
Выравнять три дива в одной строке debugx (X)HTML/CSS 9 06.10.2011 12:03