Extraire chaine entre paranthèse

Eléphant du PHP | 451 Messages

06 nov. 2013, 20:52

Bonsoir,

Alors je suis en train de faire un script pour comparer 2 fichiers sql pour voir les tables qui sont différente mais je bloque.

Voici ce que j'ai:
$db1 = file_get_contents('db1.sql');

$file_content = explode(";\n", $db1);

foreach($file_content as $k => $table) {
	$table = trim($table);

	var_dump($table);

	echo '<br><br>';

	preg_match('/^CREATE TABLE `(.*?)`/i', $table, $matches);

	echo '<pre>';
	var_dump($matches);
	echo '</pre>';
}
et j'obtiens:

Code : Tout sélectionner

string(299) "CREATE TABLE `badges` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `desc` varchar(255) NOT NULL, `code` varchar(255) NOT NULL, `level` int(5) NOT NULL, `icon` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6" array(2) { [0]=> string(21) "CREATE TABLE `badges`" [1]=> string(6) "badges" }
Mais je n'arrive pas à obtenir ce qu'il y a entre les parenthèses donc les champs comme id name etc. J'ai juste le nom des tables dans le array.

Savez-vous comme faudrait que je fasse?

Merci d'avance...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 nov. 2013, 11:25

salut,

ton code fait exactement ce que tu décris vu que tu demande ce qu'il y a entre les ` .

- un create table est rarement sur une seule ligne => ton script ne fonctionnera pas. Il est préférable d'utiliser les ; comme sséparateur (attention a ce qu'il ne soit pas dans une chaine de caractère pour les insert / update).
- les `sont optionnels ce que tu fait ne semble pas super universel (et lié à mysql seulement).
- il te faut une recherche pour ce qu'il y a entre les (). tu sais le faire pour les ` tu devrais y arriver pour les ()
- pour les nom il t e faudra
- une explode sur la virgule
- pour chaque élément du tableau précédent récupérer ce qu'il il y a entr ele début de la chaine et le 1ère espace, ne pas oublier le trim avant (et après)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

07 nov. 2013, 11:34

Il faut réfléchir sur la grammaire de la requete:
requete = CREATE|create = suite
suite = espace+ nom-de-table
nom-de-table = '|premierelettre+suite-du-nom
suite-du-nom = lettre+suite-du-nom|'+etc
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 451 Messages

07 nov. 2013, 20:25

Voilà j'ai modifié
<?php

$file = "db1.sql";

$db1 = file_get_contents($file);

$file_content = explode(";", $db1);

$tables = array();

function trimUltime($chaine){
	$chaine = trim($chaine);
	$chaine = str_replace("\t", " ", $chaine);
	$chaine = eregi_replace("[ ]+", " ", $chaine);

	return $chaine;
}

foreach($file_content as $k => $table) {
	$table = trim($table);
	$table = str_replace("\n", "", $table);
	$table = trimUltime($table);

	if(empty($table)) {
		continue;
	}

	preg_match("/^CREATE TABLE (.*?) (\() (.*?)(\)\))/i", $table, $matches);

	$table_name = str_replace("`", "", $matches[1]);

	$tables[$table_name] = array(
		'fields' => array(),
		'primary_key' => null,
		'key' => null,
		'engine' => null
	);

	foreach(explode(', ', $matches[3]) as $key => $value) {
		if(strstr($value, 'PRIMARY KEY')) {
			$value = str_replace("PRIMARY KEY (`", "", $value);
			$value = str_replace("`", "", $value);

			$tables[$table_name]['primary_key'][] = $value;
		} elseif(strstr($value, 'KEY')) {
			$value = str_replace("KEY", "", $value);
			$value = explode(" ", $value);
			$value = trim($value[1], "`");

			$tables[$table_name]['key'][] = $value;
		} else {
			$tables[$table_name]['fields'][] = $value;
		}
	}
}

echo '<pre>';
var_dump($tables);
echo '</pre>';
Et là c'est bon j'ai plus que à faire quelles modifications et surtout pouvoir modifier les 2 tableaux pour voir ce qui est différent et là c'est pas gagner