Очистка строки от ошибок пунктуации и пропущенных пробелов

Привет, у меня есть следующая строка:


Лев идет (гордо) по джунглям, но скучает по своему Тедди. Очень печальный день! Это тоже Вегетерианский День. Чем мы можем ему помочь? Может быть, с Бэмби и хорошей песней! Или с хлебом и маслом; Как думаете: согласен?

Мне нужно это:

Лев идет (гордо) по джунглям, но скучает по своему Тедди. 1 очень грустный день! Это тоже вегетарианский день. Как мы можем ему помочь? Может быть, с Бэмби и хорошей песней! Или с хлебом и маслом; Как думаете: согласен?


1Очень и 1Очень следует рассматривать одинаково.

Я пробовал это:

<?php
$string="TheLion is walking(proudly) through theJungle,but he misses hisTeddy.1very sad day!It is VegeterianDay,too. How can we help him?Maybe withBambi&a good song! Or with bread & butter;What do you think:agree?";
echo trim(preg_replace_callback('~\b\'\b(*SKIP)(*F)|\s*(\p{P}+)\s*~u', function($m) {
    return preg_replace('~\X(?=\X)~u', '$0 ', $m[1]) . ' ';
}, $string)); 
?>

Результат:

Лев идет (гордо) по джунглям, но скучает по своему Тедди. 1очень печальный день! Это тоже VegeterianDay. Как мы можем ему помочь? Может быть, с Бэмби и хорошей песней! Или с хлебом и маслом; Как думаете: согласен?


Большое спасибо


person tay    schedule 29.03.2019    source источник
comment
Время для знаменитого. Что вы пробовали?   -  person Adam    schedule 29.03.2019
comment
хорошо, извините. Я добавлю это через секунду. Не ненавижу: D   -  person tay    schedule 29.03.2019
comment
Может быть, это вам немного поможет stackoverflow.com/questions/1089613/, и я рекомендую regex101.com для тестирования   -  person Camilo    schedule 29.03.2019
comment
1 very sad day! это точно ... Когда вы используете числа в письменном тексте как слова, умирают 15 котят.   -  person Andreas    schedule 29.03.2019
comment
Это могло быть также | Высота: 10 метров | но это должно быть | Высота: 10 метров | Думаю, котят хватит: O   -  person tay    schedule 29.03.2019
comment
Проверьте regex101.com/r/9tIORf/1.   -  person Wiktor Stribiżew    schedule 29.03.2019
comment
Или вроде regex101.com/r/eJpu9T/1   -  person The fourth bird    schedule 29.03.2019
comment
@Camilo Мне это очень помогло ... Спасибо!   -  person tay    schedule 29.03.2019
comment
Спасибо, Виктор Стрибичев и Четвертая птица ... Вы спасли мне день. Один работал у меня немного лучше. Опубликую свой результат!   -  person tay    schedule 29.03.2019
comment
@Thefourthbird у меня есть последний вопрос: я должен был написать | идет (гордо) через | вместо | идет (гордо) через | Как я могу этого добиться | идет (гордо) через | тоже?   -  person tay    schedule 29.03.2019
comment
Попробуйте добавить ) в класс символов regex101.com/r/eJpu9T/2   -  person The fourth bird    schedule 29.03.2019
comment
@Thefourthbird хорошо понял - спасибо!   -  person tay    schedule 29.03.2019
comment
@Thefourthbird, я нашел еще одну ошибку. Как исключить что-то подобное | 2,5см | ? Теперь он становится 2,5 см | должно быть | 2,5 см |   -  person tay    schedule 29.03.2019
comment
Вы можете пропустить неверные значения цифр запятой цифр regex101.com/r/eJpu9T/3 Обратите внимание, что все эти дополнительные требования могут привести к большему количеству крайних случаев.   -  person The fourth bird    schedule 30.03.2019
comment
работает отлично! Ценить...   -  person tay    schedule 30.03.2019


Ответы (1)


Спасибо @Thefourthbird

<?php
$str = "TheLion is walking(proudly) through theJungle,but he misses hisTeddy.1very sad day!It is VegeterianDay,too. How can we help him?Maybe withBambi&a good song! Or with bread & butter;What do you think:agree?";
$re = '/\b(?=[(][A-Za-z])|(?<=[,.!;:?)])\b|(?<=[a-z])(?=[A-Z])|(?<=[a-z]&)|(?=&[a-z])|(?<=[0-9])(?=[a-zA-Z])/m';
$subst = ' ';
$result = preg_replace($re, $subst, $str);
echo $result;
?>

результат:

Лев идет (гордо) по джунглям, но скучает по своему Тедди. 1 очень грустный день! Это тоже вегетарианский день. Как мы можем ему помочь? Может быть, с Бэмби и хорошей песней! Или с хлебом и маслом; Как думаете: согласен?

Хороших выходных!

person tay    schedule 29.03.2019