Как удалить неправильно экранированные разрывы строк из строки - PullRequest
1 голос
/ 15 февраля 2012

Здесь у меня есть строка, в которой в какой-то момент ее \ r \ n неправильно экранировали .. Мы не можем это фундаментально исправить (представьте, что это из другой системы).

$orig = 'Helprn rnrnI need somebodyrnrnrnHelp rnrnNo just burn baby burn anybody';

КакМогу ли я безопасно, последовательно заменить rn, но не изменить слова, такие как bu * rn * (или любое другое слово, заканчивающееся на rn, например http://www.morewords.com/ends-with/rn/)?

$correctString = str_replace(' rn', '<br/>', $orig);
$correctString = str_replace('<br/>rn', '<br/><br/>', $correctString);
// etc... until we have a totally clean string..

$correctString должен был бы выглядеть так:

Help


I need somebody


Help 

No just burn baby burn anybody

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Я не знаю способа правильно определить «rn» как возврат каретки, когда у вас есть ситуация, заданная в вопросе.

Я думаю, вам нужно будет перебрать текст, разбитый на пробел,и сравните каждое значение со словарем.

Но даже это может оказаться невозможным.Как насчет слов, которые содержат «rn», но являются и словами (или именами!) Без «rn»?Откуда вы знаете, является ли «рн» возвратом каретки или частью слова?

Учиться писал ее отцу.(Леа <br/> написала своему отцу.)

Бумага была написана разорванной на его адрес.(Бумага была написана <br/> для него.)

Я думаю, что единственное, что вы можете сделать безопасно - это преобразовать экземпляры "rnrn" в двойной возврат каретки;насколько я знаю, этот шаблон не является частью какого-либо слова.

После этого шага подумайте о преобразовании данных людьми.Но, очевидно, выполнимость этого зависит от количества данных и доступности людей под вашим командованием (или чековой книжкой ...).

2 голосов
/ 15 февраля 2012

Это в принципе невозможно, некоторая информация была потеряна, поэтому вы не сможете ее восстановить.

Только ручная постобработка сможет различать исключения, такие как «запись».

Я бы сказал, что если ваш текст всегда написан на простом английском языке, создайте словарь слов, содержащий «rn», и используйте их как исключения в вашем алгоритме, что улучшило бы процесс так же, как и «сжечь», но не не будет идеальным, так как это не сработает для "burnrnbaby".

1 голос
/ 15 февраля 2012

Если это всегда группы rn, такие как rnrnrn или rnrn, то регулярное выражение для rn, за которым следует один или несколько rn, например (rn) \ 1+ для замены, будет работать до некоторой степени

...