2010-09-29 3 views
1
if (preg_match('^'.preg_quote($this->config_document_root), $filename)) { 

    $AbsoluteFilename = $filename; 

    $this->DebugMessage('ResolveFilenameToAbsolute() NOT prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__); 

    } else { 

    $AbsoluteFilename = $this->config_document_root.$filename; 

    $this->DebugMessage('ResolveFilenameToAbsolute() prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__); 

    } 
} 

Ce code a été résolu avec les instructions de la première réponse, mais comment puis-je corriger ce code aussi?Comment changer d'eregi à preg_match dans ce code?

if (!$this->config_allow_src_above_docroot && !preg_match('^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', realpath($this->config_document_root))), $AbsoluteFilename)) { 

Résolu, merci pour toutes les réponses!

+0

@ user461672 J'ai mis à jour la réponse avec un exemple pour votre deuxième extrait de code. En outre, lorsque vous postez du code sur Stackoverflow, vous devez le sélectionner et utiliser le bouton '101010' (ou appuyer sur Ctrl + K) pour le formater en code. – mikej

Répondre

0

La question est un peu déroutante car vous ne semblez pas utiliser eregi dans le code affiché. Cependant, si vous voulez vérifier si $filename commence par $this->config_document_root vous n'avez pas besoin d'une expression régulière. par exemple. pourquoi ne pas simplement utiliser strpos?

if (strpos($filename, $this->config_document_root) === 0) { 
... 

Dans une expression régulière de la ^ est l'ancrage du modèle au début du texte à apparier si le reste du motif est juste un texte simple, alors c'est effectivement juste commence par chèque, votre deuxième exemple pourrait être écrit:

$docroot = str_replace(DIRECTORY_SEPARATOR, '/', realpath($this->config_document_root)); 
if (!$this->config_allow_src_above_docroot && strpos($filename, $docroot) !== 0) { 
... 
+0

J'ai mis à jour la réponse avec un exemple d'utilisation de 'strpos' pour votre deuxième cas. Vous avez supprimé votre commentaire maintenant? Avez-vous compris vous-même? – mikej

+0

non, ceci est un code de mon blog dans wordpress, les thumnnails ne sont pas montrés dans la page d'accueil et l'erreur est dans ce dossier maintenant, j'ai fixé d'autres erreurs dans d'autres dossiers, mais mon php est faible. Merci pour tout. – Rendson

0

Vous avez déjà preg_match dans le code cité, mais je peux voir comment cela ne fonctionnerait pas. Je présume que c'est la première ligne qui a commencé comme eregi() et vous avez besoin d'aide?

Si tel est le cas, vous devez le changer comme suit:

  • Tout d'abord, la chaîne de correspondance doit commencer et se terminer par un marqueur regex (généralement / est utilisé pour cela).
  • Deuxièmement, puisque vous avez spécifié eregi(), vous devez également ajouter un modificateur i à preg_match pour le rendre insensible à la casse.

donc donné un eregi() expression qui ressemble à ceci:

'^matchthis' 

Vous devrez changer pour:

'/^matchthis/i' 

évidemment remplacer matchthis avec la chaîne de correspondance (c'est-à-dire preg_quote($this->config_document_root) dans votre exemple).

J'ai écrit a detailed explaination des différences entre ereg et preg en PHP ici il y a quelques jours. Vous pouvez trouver cela utile à lire.

Cependant, dans votre exemple, tout ce que vous vérifiez est que la chaîne commence par le contenu de la variable $this->config_document_root. En supposant que $this->config_document_root ne contient pas de motifs regex lui-même (et que l'utilisation de preg_quote garantit virtuellement que ce n'est pas le cas), vous n'avez pas besoin d'utiliser d'expressions régulières - vous pouvez simplement utiliser strpos() fonctions de chaîne. Ce serait beaucoup plus efficace de cette façon.