Expression régulière correspondant à plusieurs modèles
-
05-07-2019 - |
Question
$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);
La sortie que je veux est exemple.com/dossier
, mais tout ce que je reçois maintenant est exemple.com..folder
Je sais que c’est parce que je n’ai pas le bon motif de regex, mais quel serait ce motif?
La solution
Modifiez l'ordre des modèles '/ - /'
et '/ - /'
afin que '/ - /'
est cochée en premier, sinon '/ - /'
l'emportera sur '/ - /'
. N'interpolez pas les tableaux de l'appel à preg_replace
.
$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);
Alternatives:
- Utilisez plusieurs appels vers
preg_replace
dans l'ordre dans lequel vous souhaitez évaluer les RE. Ce n’est pas aussi désagréable que vous ne le pensez parce quepreg_replace
parcourt les tableaux et gère chaque ER à tour de rôle. -
Utiliser un remplacement évalué
$url = "www-example-com--folder"; $replacements = array('-' => '.', '--' => '/'); $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
-
Utilisez un lookahead et lookbehind
$url = "www-example-com--folder"; $searchArray = array('/(?<!-)-(?!-)/', '/--/'); $replaceArray = array('.', '/'); $url = preg_replace($searchArray, $replaceArray, $url);
Autres conseils
C’est PHP, non?
Vous avez besoin d'un quantificateur pour spécifier que vous voulez exactement deux traits d'union dans le deuxième motif. Essayez:
$searchArray = array('/-/','/-{2}/');
Les accolades indiquent "Nécessite exactement n du modèle précédent"
.Voici une bonne référence .
Voir si cela fonctionne:
$url = "example-com--folder"; $searchArray = array('([^-])-([^-])','--'); $replaceArray = array('$1.$2','/'); $url = preg_replace("$searchArray", "$replaceArray", $url);
Ce que cela dit est "correspond à tout - qui ne comporte pas de tiret avant ou après et remplace cela par un." et "jumeler double - avec /". évidemment, vous pouvez étendre ceci pour limiter le second match à 2 tirets seulement en ajoutant ([^ -]) en début et en fin de match. tel quel, " ----- " deviendra "//", ce que vous ne voudrez peut-être pas.