J'ai besoin d'obtenir le nom de fichier de fichier de fichier de fichier. Par exemple, à partir de cette chaîne Essayer de le faire avec REGEXP: P> < Pré> xxx pré> mais cela me donne une erreur. Ce que je devrais utiliser pour résoudre ce problème? P> P> \ abc \ def \ filename.txt code> J'ai besoin d'obtenir FileName.txt code>
5 Réponses :
Cela devrait le faire: résultat: strong> p>
Cela ne fonctionnera pas pour le fichier \ abc \ def \ fileName.txt code> il retournera " def \ fileName.txt code>
@nathan: Je crois que le problème était dans \ `, cela fonctionne bien avec / code> sur le chemin.
Vous devez utiliser la fonction BasEname à la place:
$filepath = '\def\abc\filename.txt';
$basename = preg_replace('/^.+\\\\/', '', $filepath);
@nathan: Cela ne fonctionnera pas, il vous donnera abcilename.txt code>
@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 code> /` 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 code> devrait être formant.
@Billy: Je pensais aussi aussi, mais étonnamment, PHP ne semble pas interpréter \ f code>.
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 2: str_replace () avec pathinfo () strong> p> Comme d'autres personnes ont dit, 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>
\\\\ code> .. Voici pourquoi P> Enfin, vous ne voulez pas utiliser Preg_replace. Il suffit de trouver le nom de fichier avec preg_match: p>
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> <?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
?>
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.
preg_replace("/[^\/]+.([^\.]+\.[a-z]{3,5})/i","$1","abc/filename.txt"); //return filename.txt
Pourquoi lancer Regex à un problème aussi simple? Edit: Je n'ai pas essayé cela - je n'ai pas de serveur PHP de travail pratique. Là $ POS p> P> P> P> P> P> P> P> P> P> P> P> P> P> P > EDIT2: Voici une version de barre oblique inverse: p>
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.
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).