Разделяне на изречение

eddyy93

Registered
Чудя се как всяко изречение да го разделя на нов ред.

Не искам по този начин:
PHP:
$text=explode(".", $text);
$text=implode(".<br><br>", $text);

Защото ако примерно съкращаваш име се прецаква ситуацията, пример:

В. Името

Така ще раздели името на нов ред:
В.
Името


Мислих си за вариянт да взима " . " и главната буква на следващото изречение, но отново проблем с имената.

Друг вариянт може ли да ми предпожите.
 

somebody

Registered
Аз бих го направил с regex.
PHP:
$text='Тук В.Иванов няма да бъде разделен,както и Mr.X и гр.София.Следващо изречение.';
echo preg_replace('/([^.\s]{3,})\./','$1<br />',$text);
Разбира се израза може да се преправи лесно според нуждите ти.

Едит: Май искаш точките на изреченията да си стоят? Ако е така това е вариянта:
PHP:
echo preg_replace('/([^.\s]{3,})\./','$1.<br />',$text);
 

eddyy93

Registered
Може ли само да ми разясниш как точно работи този регулярен израз. Да ми ги кажеш с думи тези замествания, че си нямам много идея от него.
 

somebody

Registered
eddyy93 каза:
Може ли само да ми разясниш как точно работи този регулярен израз. Да ми ги кажеш с думи тези замествания, че си нямам много идея от него.

Ами с този израз създавам следното правило:Да намери съвпадение с всески символ "." пред, който задължително трябва да има 3 или повече символа различни от "." и всякакви празни места включително и нов ред ( в случая с предефинирания клас "\s" който е еквивалент на класа [ \t\n\r\f\v]).С preg_replace замествам всяко съвпадение, което се намери с шаблона ми,с външна референция ($1) към часта от шаблона в групата ([^.\s]{3,}) и html тага за нов ред.Ако не знаеш какво е метасимвол,клас,група,референция и т.н. потърси в нета за регулярни изрази има мн информация и то на български.
 

eddyy93

Registered
Благодаря много, ами може ли да се добави ако в изречениети има кавички и точка, да не се вкарва на нов ред изречението, все пак е цитат.
 

somebody

Registered
eddyy93 каза:
Благодаря много, ами може ли да се добави ако в изречениети има кавички и точка, да не се вкарва на нов ред изречението, все пак е цитат.

PHP:
$text='Първо изречение.Изречение с "ц.и.т.а.т." в него.Цитат: "Отделен абзац с И.Вазовото творчество.Отделно изречение."';
echo preg_replace('/([^".\s]{3,}\.|"[^"]+"[^".]*\.?)/','$1<br />',$text);
Това устройва ли те?
 

eddyy93

Registered
Не вади резултат никакъв, смисъл че и да има изречения в кавичките пак си ги прави на нов ред като отделни изречения ... :(
 

somebody

Registered
Дай на лично съобщение някакъв примерен текст с различни изречения, които искаш да намира съвпадение за да го направим.
 

eddyy93

Registered
Работи, работи това, но проблема идва от това, че кавичките от базата данни ми ги вади " , ползвам htmlspecialchars при вкарване на информация, значи проверката трябва да се направи и за " , а не само за " ". Смисъл ако може и 2 те.
 

somebody

Registered
Ами изпозлвай htmlspecialchars с втори аргумент ENT_NOQUOTES или при извеждането :
PHP:
$text='"Дрън дрън"';
$text=preg_replace('/"/','"',$text);
echo preg_replace('/([^".\s]{3,}\.|"[^"]+"[^".]*\.?)/','$1<br />',$text);
 

somebody

Registered
relax4o каза:
Ех, защо откривате вече откритата топла вода ? http://php.net/manual/bg/function.htmlspecialchars-decode.php

Tова ще преобразува и <,>,& в специални знаци,така че в случая не върши работа.Ако се използва тя няма да има смисъл от htmlspecialchars при вкарването в базата данни.
 

relax4o

Registered
Добре де, помислете малко. Вкарва ги преобразувани, ами като вади в самия preg_replace ги декодирай. Какъв е толкова проблема, не мога да разбера ?
 

eddyy93

Registered
Исках да е натъпкано всичко във регулярният израз, просто да се замести там кавичките с тяхният си html код в регулярният израз, но като незнам точно кое да променя по този израз, за това ви питах.

Имам обаче проблем отново.

Пример:



Цената 5 лв. е нова

"е нова" го счита за ново изречение. За това си мисля ако може да вмъкнем ,да разделя изречението когато следващата буква е главна, иначе да не го разделя, но пък и да не прави проблеми на имената когато 2 рото име е с главна буква или някакъв друг вариянт ...


Код:
preg_replace('/([^".\s]{3,}\.|"[^"]+"[^".]*\.?)/','$1<br />',$text)
 

Горе