Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярка - разбить текст на предложения (https://javascript.ru/forum/misc/41731-regulyarka-razbit-tekst-na-predlozheniya.html)

piterberkut 26.09.2013 21:16

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

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
но проблема в том, что внутрь тегов не попадают знаки препинания:[.!?] они остаются за пределами тега..
вот надо как-то их туда засунуть, при этом не похерив, структуру текста, переносы всякие.. вот такая не тривиальная задача :)
Буду очень благодарен за помощь! :) Уже голову на этом сломал..

DjDiablo 26.09.2013 22:21

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

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


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

З.Ы. Мне кажется регулярку можно проще записать, но лень :)

рони 26.09.2013 22:46

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

DjDiablo 26.09.2013 22:59

Обрати внимание на то как в 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 тыкать посреди предложения никто не будет то вроде все нормально.

piterberkut 11.11.2013 18:16

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

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

Есть идеи у кого-нибудь?

ANAGAMA 15.11.2013 20:33

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, потом почистил бы от табуляторов, повторяющихся пробелов. заменил бы все пробелы точка|запятая ... на пробел.

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

Успехов!


Часовой пояс GMT +3, время: 20:47.