2010-05-19 3 views
4

Мне нужно использовать php, чтобы добавить пробел между периодом и следующим словом/буквой, когда их нет.php заменить регулярное выражение

Например, «Это предложение. Это следующий». должен стать «Это предложение. Это следующий». Обратите внимание на добавленное пространство после первого периода.

Моя проблема в том, что даже если я могу сделать регулярное выражение, которое находит каждую точку, за которой следует буква, как мне заменить эту точку «точкой + пространство» и сохранить букву?

Также необходимо сохранить регистр буквы, нижний или верхний.

Спасибо за ваш вклад.

+0

Делать это с помощью регулярных выражений приведет к ложным результатам с вещами, как 'Это предложение.«И это цитата.» И это содержит три точки ... 'и все другие ситуации, когда точка действительна, но следующее пространство неверно. Фактически вы не можете корректно анализировать естественный язык с помощью регулярных выражений, и даже более сложные инструменты с этим очень трудны. – Tomalak

+1

Хотя это правда, это по крайней мере позволит мне исправить некоторые из наиболее очевидных ошибок. – Enkay

ответ

9
$regex = '#\.(\w)#'; 
$string = preg_replace($regex, '. \1', $string); 

Если вы хотите, чтобы захватить больше, чем просто периоды, вы можете сделать:

preg_replace('#(\.|,|\?|!)(\w)#', '\1 \2', $string); 

Просто добавьте символы, которые вы хотите заменить в первый() блока. Не забывайте экранировать специальные символы (http://us.php.net/manual/en/regexp.reference.meta.php)

+0

Большое спасибо! Таким образом, в основном \ 1 является переменной, содержащей букву. Не возражаете ли вы объяснить это или указать мне где-нибудь, я могу лучше понять это? – Enkay

+2

\ 1 - это то, что зафиксировано в первой группе (регулярное выражение, содержащееся в первой группе круглых скобок). Это называется обратной ссылкой. – webbiedave

+1

Это не удается, если после точки есть что-то другое, кроме символа слова, например, строка «Foo.-Bar» –

0
 
$str = "This is a sentence.This is the next one."; 
echo preg_replace("#\.(\S)#", '. \1', $str); 
+1

Это ошибочно превратит «это ...» в «это ...» – ircmaxell

+0

@ircmaxell, это именно то, что спросил ОП; добавьте период, если следующий символ не является пробелом (я использовал не-whitespace, tho). Вероятно, есть много других ситуаций, в которых он не будет работать, например, URI. –

1
$str = "Will you please slow down?You're gonna kill someone.Seriously!"; 
echo preg_replace('/(!|\?|\.)([^\s\.\?!])/', '\1 \2', $str); 
+2

FYI, '(! | \? \ \.)' Может быть записано как '[!?.]', Что делает его более эффективным и читаемым. –

+1

@Alan, вам нужно будет обернуть [] в(), а также для обратной работы ([!?.]) ... – ircmaxell

+0

@Alan Moore: True. Но я хотел посмотреть, будет ли ircmaxell скопировать его дословно (как вы можете видеть, я использую скобки во втором, хотя и с лишним espaces). lol jk – webbiedave

Смежные вопросы