2010-05-19 3 views
4

J'ai besoin d'utiliser php pour ajouter un espace entre une période et le prochain mot/lettre quand il n'y en a pas.php remplace l'expression régulière

Par exemple, "Ceci est une phrase.C'est la suivante." doit devenir "Ceci est une phrase, c'est la suivante." Notez l'espace ajouté après la première période. Mon problème est que même si je suis capable de faire une expression régulière qui trouve chaque point suivi d'une lettre, comment puis-je remplacer ce point par un "point + espace" et garder la lettre?

De plus il faut garder le boîtier de la lettre, inférieur ou supérieur.

Merci de votre participation.

+0

Faire cela via regex conduira à des résultats faux avec des choses comme 'Ceci est une phrase. « Et une citation. » Et ceci contient trois points ... 'et toutes les autres situations où un point est valide mais un espace suivant est faux. Vous ne pouvez pas, en fait, analyser le langage naturel correctement avec des expressions régulières, et même des outils plus sophistiqués ont un temps très difficile avec cela. – Tomalak

+1

Bien que cela soit vrai, cela me permettra au moins de corriger certaines des erreurs les plus évidentes. – Enkay

Répondre

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

Si vous voulez capturer plus que les périodes, vous pouvez le faire:

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

ajouter simplement les caractères que vous voulez replacés dans le premier bloc(). Ne pas oublier d'échapper à des caractères spéciaux (http://us.php.net/manual/en/regexp.reference.meta.php)

+0

Merci beaucoup! Donc, fondamentalement, le \ 1 est la variable contenant la lettre. Cela vous dérange-t-il d'expliquer cela ou de me pointer quelque part pour mieux le comprendre? – Enkay

+2

\ 1 est ce qui est capturé dans le premier groupe (regex contenue dans le premier groupe de parenthèses). C'est ce qu'on appelle une référence arrière. – webbiedave

+1

Cela échoue si vous avez autre chose qu'un caractère de mot après le point, comme la chaîne "Foo.-Bar" –

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

Cela tournera par erreur "this ..." dans "this .." – ircmaxell

+0

@ircmaxell, c'est juste ce que l'OP a demandé; ajouter une période si le caractère suivant n'est pas un espace (j'ai utilisé un espace non-espace, tho). Il y a probablement beaucoup d'autres situations où cela ne fonctionnera pas non plus, les URIs par exemple. –

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

FYI, '(! | \? | \.)' Peut être écrit comme '[??.]', Ce qui le rend plus efficace et plus lisible. –

+1

@Alan, vous auriez besoin d'envelopper le [] dans() aussi bien pour que la référence arrière fonctionne ([!?.]) ... – ircmaxell

+0

@Alan Moore: Vrai. Mais je voulais voir si ircmaxell le copierait mot pour mot (comme vous pouvez le voir, j'utilise des parenthèses dans la seconde, mais avec des espaces superflus). lol jk – webbiedave