2013-02-15 4 views
0

настоящее время я используюКак редактировать пробелы между предложениями в PHP?

$text= preg_replace('/(?<=[a-zA-Z])[.](?![\s$])/','. ',$text); 

Чтобы изменить предложения в PHP, но у меня есть проблема, вот пример:

Это мой пример текста. После этого предложения нет места после точки. Другое предложение.

Что мне делать? Я хочу, чтобы PHP добавлял пробел в этом случае, но не после предложения, которое уже имеет пробел или что заканчивается «...»

Еще одно нежелательное поведение с числами. Например:

Как здорово выиграть 1.000.000 в лотерею!

Я действительно не хочу, чтобы это стало 1. 000. 000 после редактирования.

То же самое с C.J.. Он должен остаться C.J. и не C. J.

Так короче должно быть пробелов, когда:

  • «» НЕ с последующим номером (может быть другой знак)
  • игнорировать, когда есть более чем одна точка, как «...»
  • игнорировать, когда есть 1 или 2 буквы слова перед точкой.
+0

А как насчет «Dr.Whoever» и «что угодно. ком "? Или «Вы должны отказаться. Regex не может надежно справиться с этим. Они сосут контекстно-зависимые вещи».? : P – cHao

ответ

2
$text = preg_replace('/(?<! [a-z]| [a-z]{2})\.(?! |\d|\.)/i', '. ', $text); 

Смотрите здесь в действии: http://regex101.com/r/zE4pI4


Это может стать еще более сложной, если вы хотите принять во внимание инициалами в начале текста (see here how it fails). Поскольку должен просмотр назад быть фиксированной длиной, вам придется создать отдельный для просмотра назад, что:

/(?<! [a-z]| [a-z]{2})(?<!\b[a-z]|\b[a-z]{2})\.(?! |\d|\.)/ 

Смотрите здесь в действии: http://regex101.com/r/pH1mZ5

+0

Любая идея, как это сделать? и держать все связанное ... –

+0

@ M.V. - Это работает для меня: http://codepad.viper-7.com/kBcBOA –

+0

извините, да ... Я удалил комментарий, потому что меня изменил между ними ... –