Регулярка - разбить текст на предложения
Я не силен в регулярных выражениях, а загвоздка в них.. Суть, есть произвольный текст, нужно этот текст разбить на предложения, и обрамить в теги каждое..
Я накатал вот такую регулярку: 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 но проблема в том, что внутрь тегов не попадают знаки препинания:[.!?] они остаются за пределами тега.. вот надо как-то их туда засунуть, при этом не похерив, структуру текста, переносы всякие.. вот такая не тривиальная задача :) Буду очень благодарен за помощь! :) Уже голову на этом сломал.. |
Я тоже ненавижу регулярки :)
На вскидку, регулярку даже не трогал. var text='Привет мир. Куку ? хихи ?'; alert ( text.replace(/(\s+)?([^.!?]+?)([.!?]+|\n|$)/g," <translate>$2$3</translate> ") ); Замечу что у тебя перенос каретки считается за разделитель вместе с символами пунктуации ([.!?]+|\n|$). Мне кажется что |/n тебе лучше убрать из регулярки, и заменить /n на <br> вторым реплейсом З.Ы. Мне кажется регулярку можно проще записать, но лень :) |
:)
var text='Привет мир. Куку ? хихи ?'; alert ( "<translate>" + text.replace(/([.!?\n])+(?!\s*$)/g,"$1</translate><translate>")+"</translate>" ); |
Обрати внимание на то как в 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 тыкать посреди предложения никто не будет то вроде все нормально. |
Спасибо! За помощь! Перенос каретки умышленно считается окончанием предложения..
Ситуация усложнилась! Необходимо так же распарсить текст, но при условии что в нем есть теги, загвозка в том что если там есть тег типа <a href="http://yandex.ru">123</a> то скрипт разбивает эту ссылку на два предложения <translate><a href="http://yandex.</translate><translate>.ru">123</a></translate> и вот тут сколько я не бился, не выходит обойти этот момент.. Есть идеи у кого-нибудь? |
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, время: 06:27. |