12
votes

Extrait nom de fichier de chemin

J'ai besoin d'obtenir le nom de fichier de fichier de fichier de fichier. Par exemple, à partir de cette chaîne \ abc \ def \ filename.txt J'ai besoin d'obtenir FileName.txt

Essayer de le faire avec REGEXP: < Pré> xxx

mais cela me donne une erreur. Ce que je devrais utiliser pour résoudre ce problème?


1 commentaires

Il n'y a aucune raison de remplacer les caractères sans rien à l'aide de Preg_replace. Il est plus simple d'utiliser Preg_Match à la place. (Voir ma réponse pour comment).


5 Réponses :


3
votes

Cela devrait le faire: xxx

résultat: xxx


2 commentaires

Cela ne fonctionnera pas pour le fichier \ abc \ def \ fileName.txt il retournera " def \ fileName.txt


@nathan: Je crois que le problème était dans \ `, cela fonctionne bien avec / sur le chemin.



39
votes

Vous devez utiliser la fonction BasEname à la place:

$filepath = '\def\abc\filename.txt';
$basename = preg_replace('/^.+\\\\/', '', $filepath);


8 commentaires

@nathan: Cela ne fonctionnera pas, il vous donnera abcilename.txt


@SAC: Cela fonctionne parfaitement pour moi.


@casablanca: Espérons que si d'autres essaient aussi ce code :) ne semble pas fonctionner pour moi cependant.


@nathan: Je crois que le problème était dans \ `, le nom de base a fonctionné bien avec /` sur le chemin.


@sac Bon correctif sur votre Q, aussi la solution pour basseName est dans la modification maintenant - nous confondue pendant une minute là-bas!


@nathan: Oui parce que l'OP utilisait de toute façon la casserole +1;)


FYI: \ f devrait être formant.


@Billy: Je pensais aussi aussi, mais étonnamment, PHP ne semble pas interpréter \ f .



5
votes

deux solutions: strong>

  1. Preg_Match () LI>
  2. str_replace () avec PATHINFO () LI> OL>

    1: PREG_MATCH () strong> p>

    OK, le problème est donc que vous utilisez les barres anti-backs. Vous devez vous assurer que vous n'utilisez pas de guillemets doubles forts> pour définir votre fichier Filpath, car la barre oblique inverse est interprétée comme une séquence d'évacuation. Utilisez des guillemets simples. P>

    En outre, avec une regex, il est très simple d'obtenir un nom de fichier en vous déplaçant de l'arrière du chemin jusqu'à ce que vous touchiez une barre oblique inverse .... L'astuce est qu'une barre oblique backslash est \\\\ code> .. Voici pourquoi P> Enfin, vous ne voulez pas utiliser Preg_replace. Il suffit de trouver le nom de fichier avec preg_match: p> xxx pré>


    2: str_replace () avec pathinfo () strong> p>

    Comme d'autres personnes ont dit, basename () code> est une bonne option. Une autre option, s'il y a une chance que vous ayez peut-être aussi besoin du répertoire ou d'autres informations de chemin plus tard, la ligne est d'utiliser pathinfo () code> p>

    Le problème est que BasEname et PathInfo assument des barres obliques, vous devez donc convertir vos backslashes sur des barres obliques: P>

    Exemple: P>

    <?php
      // Make sure to use single quotes
    $filepath='abc\filename.txt';
      // Replace backslash with forward slash
    $filepath = str_replace('\\', '/', $filepath);
    $path_parts = pathinfo($filepath);
    
      // This is the answer you want
    echo $path_parts['basename'], "\n";
    
      // But you also have access to these
    echo $path_parts['dirname'], "\n";
    echo $path_parts['extension'], "\n";
    echo $path_parts['filename'], "\n"; // since PHP 5.2.0
    ?>
    


4 commentaires

Cela ne fonctionnera pas non plus, il a également besoin de solution de regex comme indiqué par lui.


@sac je pensais que OP a indiqué que Regex ne fonctionnait pas très bien ... GTG mais j'essaierai dans quelques-uns


Cela ne fonctionne que lorsque vous utilisez une barre oblique (/) plutôt que sur la casserole dans le chemin. +1 maintenant :)


@sac merci pour la tête. J'ai réécrit le code en utilisant une assez simple regex qui obtient tous les caractères de l'arrière du chemin qui ne sont pas une barre oblique inverse. Également, corrigé le code d'origine avec SLASH Remplacer.



1
votes
preg_replace("/[^\/]+.([^\.]+\.[a-z]{3,5})/i","$1","abc/filename.txt"); //return filename.txt

0 commentaires

0
votes

Pourquoi lancer Regex à un problème aussi simple? XXX

Edit: Je n'ai pas essayé cela - je n'ai pas de serveur PHP de travail pratique. Là peut être une erreur hors-tête avec substration et Strrpos, mais si tel est le cas, vous n'ajoutez pas ou soustrayez-en un de $ POS EDIT2: Voici une version de barre oblique inverse: xxx


2 commentaires

Op a des backslashes, vous ne pouvez donc pas double citation $ $ source et vous devez échapper à la barre oblique inverse en $ POS


@Peter: a ajouté une version de barre oblique inverse.