2010-10-01 9 views
1

J'ai une chaîne nommée File_Test_name_1285931677.xml. File est le mot commun et 1285931677 est un nombre aléatoire. Je veux supprimer File_ et _1285931677.xml, c'est-à-dire le préfixe jusqu'au premier _ et le suffixe du dernier _ sur.Chaîne Remplacer dans PHP

+4

Vous devriez élaborer un peu en ajoutant concours, parce que la réponse littérale à votre question est trivial 'str_replace' –

+0

Y at-il un motif ou le fichier est toujours nommé comme ça? – Shikiryu

+0

Je veux supprimer Première chaîne Avant _ et dernière chaîne après_ – Warrior

Répondre

5

Vous pouvez le faire avec explode, array_slice et implode:

implode('_', array_slice(explode('_', $str), 1, -1)) 

Avec explode la chaîne est coupé en parties à _ afin que le résultat est un tableau comme celui-ci:

array('File', 'Test', 'name', '1285931677.xml') 

Avec array_slice tout de la seconde à la seconde est saisi, par exemple:

array('Test', 'name') 

Il est ensuite remis ensemble à l'aide implode, entraînant:

Test_name 

Une autre approche serait d'utiliser strrpos et substr:

substr($str, 5, strrpos($str, '_')-5) 

Depuis File_ a une longueur fixe, nous peut utiliser 5 comme position de départ. strrpos($str, '_') renvoie la position de la dernière occurrence de _. En soustrayant 5 de cette position, nous obtenons la distance du cinquième caractère à la position de la dernière occurrence que nous utilisons comme longueur de la sous-chaîne.

1

Si vous ne souhaitez que remplacer en tant que chaîne replace_string est le chemin à parcourir

$str = "File_Test_name_1285931677.xml"; 
echo str_replace("File_Test_name_1285931677.xml",'Test_name', $str); 

Si vous souhaitez renommer un fichier, vous devez utiliser rename:

rename("/directors_of_file/File_Test_name_1285931677.xml", "Test_name"); 
3

Je serais paresseux et utiliser:

$file_name = "File_Test_name_1285931677.xml"; 
preg_replace("/^File_Test_name_\d+\.xml$/", "Test_name.xml", $filename); 

Ceci est fourni que vous voulez toujours appeler il Test_name. Si TEST_NAME change:

preg_replace("/^File_(.+)_\d+\.xml$/", "$1.xml", $file_name); 

EDIT (Encore une fois): Relisez votre mise à jour. Vous voulez le deuxième exemple.

1
$filename = preg_replace('/^File_(.*?)_\d+\.xml$/', '$1', $filename); 
0

Vous pouvez également utiliser substr mais clairement un str_replace avec correspondance de motif serait mieux:

$file = "File_test_name_12345.xml"; 
$new_file = substr($file,strpos($file,'_')+1,strrpos($file,'_')-strpos($file,'_')).substr($file,strrpos($file,'.')); 
+0

Et les gens disent que les expressions régulières sont illisibles :) –