2012-03-24 3 views
0

Je veux modifier un script PHP que j'utilise dans WordPress (Auto Featured Image plugin).
Le problème est que ce script crée des noms de fichiers pour les vignettes en fonction des URL de l'image.PHP/regex: Script pour créer des noms de fichiers avec des tirets au lieu d'espaces

Cela sonne bien jusqu'à ce que vous obtenez un nom de fichier avec des espaces et la vignette est quelque chose comme this%20Thumbnail.jpg et quand le navigateur va http://www.whatever.com/this%20Thumbnail.jpg il convertit le %20 à un espace et il n'y a aucun nom de fichier sur le serveur de ce nom (avec des espaces) .

Pour résoudre ce problème, je pense J'ai besoin de changer la ligne suivante de telle manière que $ imageURL est filtré pour convertir %20 en espaces. Vous avez raison?
Voici le code. Peut-être pouvez-vous me dire si j'aboie le mauvais arbre.
Merci!

<?php 
    static function create_post_attachment_from_url($imageUrl = null) 
    { 
     if(is_null($imageUrl)) return null; 
     // get file name 
     $filename = substr($imageUrl, (strrpos($imageUrl, '/'))+1); 
     if (!(($uploads = wp_upload_dir(current_time('mysql'))) && false === $uploads['error'])) { 
      return null; 
     } 
     // Generate unique file name 
     $filename = wp_unique_filename($uploads['path'], $filename); 
?> 
+0

Pourquoi ne pas utiliser md5? – tttony

+0

Qu'en est-il des autres personnages? –

+0

@ttony - utilise md5 comment? – user1289585

Répondre

1

Edité à une réponse plus appropriée et complète:

static function create_post_attachment_from_url($imageUrl = null) 
{ 
    if(is_null($imageUrl)) return null; 

    // get the original filename from the URL 
    $filename = substr($imageUrl, (strrpos($imageUrl, '/'))+1); 

    // this bit is not relevant to the question, but we'll leave it in 
    if (!(($uploads = wp_upload_dir(current_time('mysql'))) && false === $uploads['error'])) { 
     return null; 
    } 

    // Sanitize the filename we extracted from the URL 
    // Replace any %-escaped character with a dash 
    $filename = preg_replace('/%[a-fA-F0-9]{2}/', '-', $filename); 

    // Let Wordpress further modify the filename if it may clash with 
    // an existing one in the same directory 
    $filename = wp_unique_filename($uploads['path'], $filename); 

    // ... 
} 
+0

ai-je tort de supposer que le problème ne se trouve pas dans la ligne que vous décrivez, mais avec la ligne 5 dans mon exemple de code? Je vous remercie pour votre réponse mais je ne pense pas que cela réponde à ma question. Je vous remercie! – user1289585

+0

Je pense que votre problème n'est pas tout à fait clair pour moi: essayez-vous de résoudre un bug ou simplement de corriger l'inconvénient mineur d'avoir échappé% 20 séquences dans le nom de fichier de la vignette enregistrée? Pour autant que je sache, le script prend l'URL d'une image sur Internet, récupère le contenu et enregistre cette image sur le disque pour créer une pièce jointe dans Wordpress. J'ai modifié le code pour supprimer tout caractère échappé (comme des espaces, des symboles, etc.) du nom de fichier d'image d'origine et remplacer ces caractères par des tirets. –

+0

$ filename = preg_replace ('/% [a-fA-F0-9] {2} /', '-', $ filename); Cette ligne m'a sauvé la vie! merci – danyo

0

Vous feriez mieux de remplacer les espaces dans le nom de l'image ou des underscores hypens en utilisant regexp.

$string = "Google%20%20%20Search%20Amit%20Singhal" 
preg_replace('/%20+/g', ' ', $string); 

Cette expression remplacera plusieurs espaces (% 20) par un seul espace ('').

+0

codef0rmer - Je ne comprends pas votre réponse. Je ne cherche pas à remplacer les espaces, en soi. Peut-être que je n'étais pas clair avec ma question. Je veux modifier le script ci-dessus, qui obtient les noms de fichiers comme des URL avec% 20 substitué pour les espaces, avec un script qui prend les noms de fichiers qui ont% 20 en eux et remplace les% 20 avec des tirets. – user1289585

+0

Je pense que lorsque vous téléchargez une image, elle ne remplace pas les espaces avec certains caractères (par exemple underscore ou hypen) et l'URL de l'image a% 20 caractères remplaçant les espaces que vous ne voulez pas. Ma suggestion serait de remplacer les espaces par underscore/hypen pendant que vous téléchargez une image au lieu d'analyser% 20 plus tard. De toute façon, j'ai mis à jour ma réponse. – codef0rmer

+1

Désolé, mais je crois que cette regex est fausse: '/% 20 + /' devrait être '/ (% 20) + /', sinon, vous remplacez seulement des choses comme '% 20' et'% 200', '% De plus, le '+ 'ne devrait pas être nécessaire, et le modificateur' g' n'est pas valide, si je ne me trompe pas, 'preg_replace' remplace toutes les occurrences dans la chaîne de toute façon. –

Questions connexes