2010-05-14 18 views
0

J'essaie d'écrire un analyseur CSS pour envoyer automatiquement les URL des images d'arrière-plan à différents sous-domaines afin de paralléliser les téléchargements.Remplacer la chaîne par une valeur incrémentée

Fondamentalement, je veux remplacer des choses comme

url(/assets/some-background-image.png) 

avec

url(http://assets[increment].domain.com/assets/some-background-image.png) 

J'utilise ceci dans une classe que je veux éventuellement évoluer en faisant diverses tâches d'analyse CSS.

Voici les parties pertinentes de la classe:

private function parallelizeDownloads(){ 
    static $counter = 1; 
    $newURL = "url(http://assets".$counter.".domain.com"; 

Le compteur doit être remis à zéro quand il atteint 4 afin de limiter à 4 sous-domaines.

if ($counter == 4) { 
     $counter = 1; 
    } 
    $counter ++; 
    return $newURL; 
} 

public function replaceURLs() { 

C'est la plupart du temps un non-sens, mais je sais que le code que je suis à la recherche ressemble un peu comme celui-ci. Note: $ this-> css contient la chaîne CSS.

preg_match("/url/i",$this->css,$match); 
    foreach($match as $URL) { 
     $newURL = self::parallelizeDownloads(); 
     $this->css = str_replace($match, $newURL,$this->css); 
    } 
} 
+0

Alors, quelle est la question? – eykanal

+0

Oh, désolé, ce n'était pas très clair. Fondamentalement, comment vais-je faire cela pour que cela fonctionne: D? En ce moment, il remplace les cordes correctement mais n'incrémente rien. Sinon, je suis à la recherche de suggestions sur la façon de le faire de la bonne façon. – Andrei

Répondre

0

Ok, j'ai finalement réussi à utiliser preg_replace_callback. Voici le code:

private function parralelizeDownloads($matches) { 
    static $counter = 1; 
    $newURL = ''; 
    foreach ($matches as $match) { 
     $newURL = "url(http://assets" . $counter . ".domain.com"; 
     if ($counter == 4) { 
      $counter = 0; 
     } 
     $counter++; 
    } 
    return $newURL; 
} 

public function replaceURLs() { 
    $this->css = preg_replace_callback("/url\(/i", Array($this, "parralelizeDownloads"), $this->css); 
} 
0

set $ counter comme une propriété de la classe, et comme référence $ this-> compteur, ou auto :: compteur $ si vous définissez comme une propriété statique

Vous appelez auto :: parallelizeDownloads() dans votre méthode publique replaceURLs(), donc parallelizeDownloads() devrait vraiment être défini comme static

+0

Merci pour le conseil. J'ai modifié le code mais je ne reçois toujours aucune valeur incrémentée. Je pense qu'il y a un problème avec la méthode replaceURLs() ... – Andrei

+0

Vous voudrez aussi probablement utiliser if ($ counter == 4) { $ counter = 0; } $ compteur ++; sinon vous réinitialiser le compteur à 1, puis immédiatement l'incrémenter à 2. Votre boucle dans replaceURLs() ne fait pas grand-chose, car vous continuez à ignorer $ this-> css –

+0

Merci! En regardant cela, il semble évident maintenant, c'est pourquoi je ne voyais aucun incrément dans les URL remplacées. Pourtant, comment pourrais-je faire pour que cela fonctionne? Preg_match est-il le bon outil pour cela? – Andrei