2011-07-24 2 views
1

Je lignes de texte comme ceci:Trouver et supprimer des éléments définis dans le texte

CPU: Intel Core i7 970 $580 
Mobo: Gigabyte X58A-UD5 $300 
RAM: Kingston 6x 4GB DDR3 $230 
HDD: Samsung Spinpoint F3 1TB $70 
GPU: 1GB Nvidia GeForce GTS450 $113 
Case: Antec P183 $135 
PSU: Seasonic M12II 520W $113 
ODD: Samsung SG-B083A $29 
CPU HSF: Coolermaster Hyper 212 $30 

Je veux supprimer les CPU:, etc Mobo: les bits (donc en gros rien derrière : [notez l'espace]).
En outre, je souhaite supprimer le bit de prix à la fin - $580 etc.

Quelque chose comme ça devrait fonctionner?

preg_replace('/\$([0-9\.]+)/', $PC_Specs); 

C'est ainsi que je peux stocker le nom du produit dans une variable.

Merci beaucoup.

Répondre

2

Essayez quelque chose comme:

preg_replace('/(^\w+:\s*|\$\d*\.?\d+\s*$)/m', '', $PC_Specs); 

D'une part, j'ai ajouté la chaîne vide comme second paramètre, qui est nécessaire pour dire preg_replace quoi remplacer les matchs avec. J'ai également modifié l'expression rationnelle pour qu'elle corresponde à deux sous-expressions distinctes:

^\w+:\s* Correspond au début d'une ligne avec au moins un caractère de mot suivi de deux points et de 0 ou plusieurs espaces.

\$(\d*\.?\d+\s*$ Correspond à un signe dollar suivi d'un nombre avec un point décimal possible et zéro ou plusieurs espaces avant la fin de la ligne.

J'ai ajouté le modificateur /m pour en faire une regex multiligne, ce dont vous avez besoin si vous faites passer le tout en un. Si vous passez dans un tableau de lignes, vous pouvez le supprimer.

EDIT En réponse au commentaire:

$PC_Specs = 
'CPU: Intel Core i7 970 $580 
Mobo: Gigabyte X58A-UD5 $300 
RAM: Kingston 6x 4GB DDR3 $230 
HDD: Samsung Spinpoint F3 1TB $70 
GPU: 1GB Nvidia GeForce GTS450 $113 
Case: Antec P183 $135 
PSU: Seasonic M12II 520W $113 
ODD: Samsung SG-B083A $29 
CPU HSF: Coolermaster Hyper 212 $30'; 

$matches = array(); 
preg_match_all('/^(\w+):\s*(.*?)\s*\$\d*\.?\d+\s*$/m', $PC_Specs, $matches); 
for($i = 0; $i < count($matches[1]); $i++) 
    ${strtolower($matches[1][$i])} = $matches[2][$i]; 

Une fois le code ci-dessus fonctionne,

$cpu seront "Intel Core i7 970"

$mobo seront "Gigabyte X58A-UD5"

$ram sera "Kingston 6x 4GB DDR3"

etc ... :)

+0

Merci, mais chaque ligne doit avoir une variable ... donc cela ne marchera pas. Comme: $ cpu = "Intel Core i7 970" etc (évidemment dynamique) – Dean

+0

@Dean, oh haha, j'ai raté ce peu dans votre question initiale. Je vais mettre à jour mon message. Est-ce un tableau de lignes, ou une seule chaîne contenant toutes les lignes? – Paulpro

+0

Chaîne unique contenant toutes les lignes. Un utilisateur entre dans les détails via un TEXTFIELD ou similaire (sur un formulaire, un peu comme un pastebin). – Dean

Questions connexes