11
votes

Faites correspondre le chemin d'une URL, moins l'extension du nom de fichier

Quelle serait la meilleure expression régulière de ce scénario?

Compte tenu de cette URL: xxx

Comment dois-je choisir tout entre (mais non compris) < code> http://php.net et .php : xxx

ceci est pour un NGinx fichier de configuration.


1 commentaires

(?: http: [\ /] {2}. +? [.]) [^ \ /] + (. +) [.] +. +


11 Réponses :


3
votes

Essayez ceci:

preg_match("/net(.*)\.php$/","http://php.net/manual/en/function.preg-match.php", $matches);
echo $matches[1];
// prints /manual/en/function.preg-match


0 commentaires

8
votes

Comme ceci: xxx

explication: xxx


2 commentaires

Merci échoué pour l'explication détaillée, qui fonctionne parfaitement


'/ net (. *) \. PHP /' , version plus simple, plus petite (et éventuellement meilleure performance) de la même expression. (Je préfère les expressions sans surveillance gustablement inutiles.)



0
votes

Cette correspondance d'URL générale vous permet de sélectionner des parties d'une URL: xxx


0 commentaires

20
votes

Une expression régulière n'est peut-être pas l'outil le plus efficace pour ce travail.

Essayez d'utiliser parse_url () < / Code> , combiné avec pathinfo () : xxx

Les sorties de code ci-dessus: xxx


4 commentaires

Merci Phoenix, cela fonctionne aussi, mais je cherchais une solution Reg Ex pour cela.


@silkadmin qui est curieux; Pourquoi la solution doit-elle être une expression régulière?


Désolé, je n'aurais pas dû utiliser la balise PHP qui était confuse, j'avais besoin de la regex pour un fichier de configuration Nginx où votre solution n'est pas une option


Ajá. Merci pour l'info; Je suis allé de l'avant et j'ai mis à jour votre question pour que cela soit plus clair pour les futurs visiteurs.



-1
votes

expression régulière pour tout correspondant à tout ce qui est "net" et avant ".php":

$pattern = "net([a-zA-Z0-9_]*)\.php"; 


2 commentaires

Cela ne correspondra pas à l'exemple donné, car il y a un point dans celui-ci: fonction.cep-match


Sans parler de cela ne correspond pas à des barres obliques non plus. En outre, le regex n'est pas ancré - ce qui ne causera probablement pas de problèmes (l'opérateur * est gourmand par défaut), mais ce n'est pas une bonne pratique.



3
votes

Il n'est pas nécessaire d'utiliser une expression régulière pour disséquer une URL. PHP a des fonctions intégrées pour cela, pathinfo () et parse_url () .


0 commentaires

0
votes

Voici une solution de regex meilleure que ce que la plupart ont fourni jusqu'à présent, si vous me demandez: http: // regex101. COM / R / NQ8RH5

/http:\/\/[^\/]+\K.*(?=\.[^.]+$)/i


0 commentaires

0
votes

simple: xxx

$ correspondance [0] est votre URL complète, $ correspondances [1] est la partie souhaitée .

Voir vous-même: http://codepad.viper-7.com/hhmwi2 < / a>


0 commentaires

2
votes

Juste pour le plaisir, voici deux façons qui n'ont pas été explorées: xxx pré>

ou: p> xxx pré>

basé sur L'idée que les schémas http http: // code> et https: // code> sont au plus 8 caractères, il suffit généralement de trouver la première barre oblique à partir de la 9ème position. Si l'extension est toujours .php code> Le premier code fonctionnera, sinon l'autre est requis. P>

pour une solution d'expression régulière pure, vous pouvez casser la chaîne comme ceci:

$parts = pathinfo(parse_url($url, PHP_URL_PATH));
echo $parts['dirname'] . '/' . $parts['filename'];


0 commentaires

0
votes

| (? <= \ w) /.+ (? = \. \ w + $) |
  • Tout sélectionner dans le premier littéral '/' précédé de
  • Regardez derrière un mot (\ w) caractère
  • jusqu'à ce que suivi d'un regard sur l'avenir
    • littéral "." annexé par
    • Un ou plusieurs caractères de mot (\ w)
    • avant la fin $ xxx

      | // [^ /] * (. *) \. \ w + $ |
      • Trouvez deux littéraux '//' suivis de tout ce que quelque chose qu'un littéral '/'
      • Sélectionnez tout jusqu'à ce que
      • trouver littéral '.' ' suivi de seulement des caractères Word \ w avant la fin $ xxx

        | / [^ /] + (. *) \.
        • trouver littéral '/' suivi d'au moins 1 ou plus non littéral '/'
        • Agressif Sélectionnez tout avant le dernier littéral "." xxx

          | / [^ /] + \ k. * (? = \ \.) |
          • trouver littéral '/' suivi d'au moins 1 ou plus non littéral '/'
          • Réinitialiser Sélectionnez Start \ k
          • agressif Sélectionnez tout avant
          • Regardez l'avenir Dernier littéral '.' xxx

            | \ w + \ k /.* (? = \ \.) |
            • Trouvez un ou plusieurs caractères de mot (\ w) avant un littéral '/'
            • Réinitialiser Sélectionnez Start \ k
            • Sélectionnez Littéral '/' suivi de
            • n'importe quoi avant
            • Regardez l'avenir Dernier littéral '.' xxx


0 commentaires

-1
votes

http: [\ /] {2}. +? [.] [^ \ /] + (. +) [.] +

Voyons, ce qu'il fait:

http: [\ /] {2}. +? [.] [^ \ /] - groupe non-capture pour http://php.net

(. +) [.] - Pièce de capture jusqu'à ce que le dernier point se produise: /manual/fr/function.preg-match

[.]. + - Extension correspondante du fichier comme ceci: .php


0 commentaires