$re = '/^
( # Débute par un article
Le\ |La\ |Les\ |Los\ |Aux\ |L\'
| # ou
) # rien
([A-ZÉÇŒÈÎ]) # Suivi d\'une majuscule
( # puis ...
((-| # un trait-d\'union ou
\ | # un espace ou
\ -\ | # un espace suivi d\'un trait d\'union suivi d\'un espace ou
\') # une apostrophe
[A-ZÉÇŒÈÎ]) # suivi d\'une majuscule
| # ou bien
(\'|-|\ |) # une apostrophe ou un trait-d\'union ou un espace ou rien
[a-zàâéèêëïîÿôûüœç] # suivi d\'une minuscule
)* # 0 ou plusieurs fois
( # terminé par
\ \([A-Z][a-z]*\) # un espace suivi d\'un mot entre parenthèse débutant par une majuscule
| # ou
) # rien
$/mx';
$str = 'Invalides
AA
NNouvelle
A\'
Nouvelle\'
A-
Nouvelle-
AA\'
AA-
NNouvelle\'
NNouvelle-
-Ville
--Ville
\'Francheville
\'\'Francheville
A\'\'ville
L\'\'Épine
A--Ville
Nouvelle--Ville
A Ville
Nouvelle Ville
A\'-Ville
Nouvelle\'-Ville
A-\'Ville
Nouvelle-\'Ville
A\' Ville
Nouvelle\' Ville
A- Ville
Nouvelle- Ville
Nouvelle-es- Ville
Saint-Martin-es- Ville
AAA
AaA
A a
A A
Théoriques ???
A A
A\'A
A-A
Nouvelle\'Ville
Valides (existants)
Marseille
Saint-Remy-en-Bouzemont-Saint-Genest-et-Isson
Saint-Martin-d\'Hères
Hœdic
Saint-Genis
Y
Ay
Bû
Oô
Aast
Niederschaeffolsheim
Kermoroc\'h
M\'tsangamouji
L\'Île-Rousse
L\'Épine
Le Mans
La Celle-Saint-Cloud
Le Pont-de-Beauvoisin
Hitiaa O Te Ra
Saint-Nom-la-Bretèche
Saint-Germain-de-Tallevende-la-Lande-Vaumont
Beaujeu-Saint-Vallier-Pierrejux-et-Quitteur
Île-aux-Moines
Île-d\'Aix
Château-Chinon (Campagne)
Château-Chinon (Ville)
Noirmoutier-en-l\'Île
Aix-Villemaur-Pâlis
La Chapelle du Lou du Lac
Saint-Thégonnec Loc-Eguiner
Val d\'Arcomie
Ance Féas
Le Bas Ségala
Le Haut Soultzbach
Bairon et ses environs
Dhuys et Morin-en-Brie
Parves et Nattages
Haut Valromey
Saint Paterne - Le Chevain
Pont de Montvert - Sud Mont Lozère
Saint Géry-Vers
Villages du Lac de Paladru
Bagnoles de l\'Orne Normandie
Cœur de Causse
Beauce la Romaine
Les Hauts d\'Anjou
Les Pechs du Vers
Segré-en-Anjou Bleu
Ingrandes-Le Fresne sur Loire
Montrichard Val de Cher
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php