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?

Était-ce utile?

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 que preg_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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top