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 ... :)
Merci, mais chaque ligne doit avoir une variable ... donc cela ne marchera pas. Comme: $ cpu = "Intel Core i7 970" etc (évidemment dynamique) – Dean
@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
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