6
votes

Correspondant à tout un certain caractère après une lunette positive

J'essaie d'obtenir le droit Regex pour tout cela toute la matinée et j'ai frappé le mur. Dans la chaîne suivante, je ne voudrais pas correspondre à chaque barre oblique qui suit .com / code> à l'exception de tout / code> après em> le URL.

$string = "http://example.com/foo/20/jacket Input/O/utput"; // misses the /'s in the URL
    matches----------------------------------------^
$string = "http://example.com/f/2/jacket Input/O/utput"; // don't want the match between Input/Output
    matches--------------------^-^--------------^                    


3 commentaires

La fonction Preg_Match renvoie une correspondance. Vous dites que vous devez faire correspondre tous les caractères il y a après un certain motif. Vous devez utiliser preg_match_all .


J'ai toujours une impression c'est un problème xy. Qu'essayez-vous d'atteindre? Pourquoi correspondre à ces barres obliques? Vous pouvez URL_PARSE L'URL, puis faire ce que vous voulez. Exploser, par exemple


Non, ce n'est pas un problème Xy @ Wiktorstribiżew, comme la regex devrait fonctionner dans n'importe quel du PREG _ * Fonctions.


3 Réponses :


3
votes

Utilisez \ k ici avec \ g .grab the groups . xxx

Voir démo .

https://regex101.com/r/at3kg2/6 xxx

remplacer xxx


7 commentaires

Pour une raison quelconque, cela ne fonctionne pas dans le contexte de Preg_Match ()


OK - Preg_Match_All () TRAVAINS Mais autre PREG .... Fonctions échouez - comme Preg_replace () .


@Jayblancard Le seul problème avec Remplacer est un remplacement supplémentaire sera arrivé à la fin ... devinez que cela devra être traité séparément


J'ai eu ceci comme le retour http://example.com/foo|/12/Jacket entrée / sortie à l'aide de votre code. Notez qu'aucune des barres obliques n'a été supprimée, mais un tuyau a été ajouté. Même dans votre exemple de substitution, les barres obliques sont laissées en place. Je vraiment apprécie votre aide avec cela, il semble que nous battions tous les deux la tête contre le mur. L'un des + 1 est le mien.


@Jayblancard Nous pouvons le faire comme ça ... u juste besoin de supprimer un extra | plus tard. REGEX101.com/R/AT3KG2/8


Pouvez-vous également copier ces regex dans votre réponse. Ils ne peuvent pas rester sur REGEX101 pour toujours! Qui rendrait vos réponses inutiles aux autres


Ce dernier exemple que vous avez provoqué des espaces ajoutés et un tuyau supplémentaire @vks http://example.com/foo||12|Jacket|wow



3
votes

Si vous souhaitez utiliser Preg_replace , cette regex devrait fonctionner: xxx

remplaçant chaque / par un | après le premier / qui apparaît après le démarrage .com .

lookedede négatif (? est nécessaire pour éviter de remplacer une chaîne sans démarrer .com comme / foo / bar / baz / abcd .

Démo Regex


3 commentaires

Le problème avec c'est que vous remplacez le / dans la partie de la chaîne avec entrée / sortie


Il ne devrait s'agir que les slashes après foo, mais pas dans quoi que ce soit dans l'URL


Il existe une URL dans la chaîne, ainsi que d'autres données. Les barres obliques dans les autres données ne doivent pas être affectées.



1
votes

Un autre \ g code> et \ k code> idée basée.

$re = '~(?:^\S+\.com/\w|\G(?!^))\w*+\K/~';


0 commentaires