J'ai extrait l'URL actuelle dans une variable. Donc, mon URL est dans la variable $ url.

Exemple de $url = 'http://domain.test/en/offers/guided-tours/neighbourhoods/academy-traces-of-the-academy-in-antwerp/'

Maintenant, je veux ajouter une nouvelle variable ($venueSlug) avant la dernière barre oblique. Exemple de valeur de cette variable $venueSlug = 'antwerp-city-guided';

Le résultat recherché serait

$newUrl = 'http://domain.test/en/offers/guided-tours/neighbourhoods/antwerp-city-guides/academy-traces-of-the-academy-in-antwerp/'

Mon code ressemble à ceci:

function custom_post_type_link_venue ($urlsub, $post) {
 
        //get venue slug
        $venueSlug = get_post_field( 'post_name', $venueId );
        
        if (!empty($venueSlug)) {
            if (substr_count($urlsub, $replace) == 0) {
                $urlsub = str_replace($s=strrchr($urlsub, '/'), "'/'$venueSlug.$s", $urlsub);
                
            }

        }

    return $urlsub;
}

Mais il ajoute la nouvelle variable avant chaque barre oblique:

http://'/'.antwerp-city-guides./'/'.antwerp-city-guides./antwerp.test'/'.antwerp-city-guides./en'/'.antwerp-city-guides./offers'/'.antwerp-city-guides./guided-tours'/'.antwerp-city-guides./neighbourhoods'/'.antwerp-city-guides./academy-traces-o…ademy-in-antwerp'/'.antwerp-city-guides./ ‎
0
Dennis 24 févr. 2021 à 11:16

3 réponses

Meilleure réponse

Vous pouvez utiliser comme ça

$url       = 'http://domain.test/en/offers/guided-tours/neighbourhoods/academy-traces-of-the-academy-in-antwerp/';
$venueSlug = 'antwerp-city-guided';

$explode = explode("/",$url);
$new_url = $venueSlug."/".$explode[count($explode)-2];
print_r(str_replace( $explode[count($explode)-2],$new_url,$url));

/*
Output
http://domain.test/en/offers/guided-tours/neighbourhoods/antwerp-city-guided/academy-traces-of-the-academy-in-antwerp/
*/
1
Younes Zaidi 24 févr. 2021 à 08:26

Un appel de fonction, une ligne, facile.

Correspond à la position de largeur nulle avant la dernière barre oblique qui est suivie d'un ou plusieurs caractères non barre oblique, puis éventuellement suivie d'une barre oblique, puis de la fin de la chaîne.

Code: (Démo)

$url = 'http://domain.test/en/offers/guided-tours/neighbourhoods/academy-traces-of-the-academy-in-antwerp/';
$venueSlug = 'antwerp-city-guided';

echo preg_replace('~(?=/[^/]+/?$)~',"/$venueSlug", $url);
0
mickmackusa 24 févr. 2021 à 08:50

Le problème avec votre code actuel est que, comme il y a un / à la fin de l'url, strrchr le trouvera comme dernière occurrence et remplacera donc chaque / par la substitution.

Ce code utilise trim() pour supprimer tous les / de fin avant d'appeler strrchr() et trouve ainsi le dernier segment.

    if (substr_count($urlsub, $replace) == 0) {
        $point = strrchr(rtrim($urlsub, "/"), '/');
        $urlsub = str_replace($point, "/$venueSlug$point", $urlsub);

    }
1
Nigel Ren 24 févr. 2021 à 08:31