2010-08-19 5 views
0

Première fois que je poste ici et j'espère que quelqu'un pourra m'aider.Problème d'utilisation de tableaux indexés avec preg_replace() PHP

Je dispose d'un fichier Whos la numérotation commence à 610 et continue à 1019. Je veux utiliser la fonction de preg_match() de PHP pour commencer la numérotation de 0 et aller jusqu'à 410.

Voici un code i » Je travaillais sur. Mais je ne peux pas obtenir la fonction pour remplacer les numéros. Je ne sais pas pourquoi et je n'ai pas d'erreurs.

<?php 

$string = "610 611 612 613 614 615 616 617"; //this isnt the actual file but will do. The actual file is more complicated. This is just a test string. 

$patterns = array(); 
for ($i=610; $i<1020; $i++) { 
    $patterns[$i] = '/$i/'; 
} 

$replacements = array(); 
for ($j=1; $j<410; $j++) { 
    $replacements[$j] = '\r\n' . $j; 
} 

$newText = preg_replace($patterns, $replacements, $string); 
echo $newText; 

?> 

J'ai utilisé l'exemple n ° 2 du formulaire http://www.php.net/manual/en/function.preg-replace.php comme référence.

Merci à l'avance pour toute aide :)

+2

Pouvez-vous décrire ce qui ne fonctionne pas pour vous? Les entrées, les sorties et les sorties attendues aideraient ... – ircmaxell

+4

N'utilisez pas de guillemets simples sur ''/ $ i /'' et ''\ r \ n''. Utilisez plutôt des guillemets doubles. Voir la différence ici: http://php.net/manual/en/language.types.string.php – NullUserException

+0

Je ne sais pas, mais je trouve étrange d'utiliser des expressions régulières pour cette situation. – BoltClock

Répondre

0

Ce ne sera pas?

implode(" ", range(0, 410)) 

Il semble étrange que vous vouliez les changer "en place".

+0

battu à elle :) exactement ce que je pensais. –

+0

Vous avez manqué ce commentaire: '// ce n'est pas le fichier réel, mais fera l'affaire. Le fichier réel est plus compliqué. Ceci est juste une chaîne de test. » – NullUserException

+1

@Null Non, je l'ai lu. Mais cela ne fournit aucun aperçu. Si quoi que ce soit, cela pourrait rendre la solution regex moins désirable parce que si le texte suivait, il pourrait contenir certains des nombres. – Artefacto

0

Votre tableau "patterns" ressemble à ceci:

$patterns (
    610 => '/$i/', 
    611 => '/$i/', 
... 
} 

Vous devez utiliser des guillemets doubles sur la ligne 7:

$patterns[$i] = "/$i/"; 
0

Ne vous embêtez pas avec des expressions régulières pour un cas simple. .. Utilisez simplement str_replace. Ce sera plus rapide et équivalent à votre code actuel ...

$patterns = array(); 
for ($i=610; $i<1020; $i++) { 
    $patterns[] = $i; 
} 

$replacements = array(); 
for ($j=1; $j<410; $j++) { 
    $replacements[] = '\r\n' . $j; 
} 

$string = str_replace($patterns, $replacements, $string); 

Maintenant, vous auriez encore besoin d'utiliser preg_replace si les motifs sont plus complexes (par exemple, ne recherchant le début de la ligne, etc) ... Mais pour un modèle si simple, ça ne vaut pas la peine (IMHO) ...

+0

''\ r \ n'' ne sera pas une nouvelle ligne. 'str_replace()' n'est pas vraiment approprié pour ça (pense aux limites des mots) – NullUserException

+0

Je le sais. Mais il a dit qu'il avait affaire à des fichiers. Donc j'ai supposé qu'il savait que ce ne serait pas une nouvelle ligne et que je voulais mettre un '\ r \ n 'littéral là-dedans ... Je n'étais pas sûr si c'était une erreur ou explicite, alors je suis allé avec quoi (s) il a fourni ... – ircmaxell

+0

Oui, cela aiderait si l'OP fournissait des fichiers d'entrée et de sortie attendus – NullUserException