Preg Match Frage

Starfox2007

Mitglied
Hallöle

Mit Preg Match hab ich so immer meine Schwierigkeiten.

Ich möchte eine Tabelle auslesen und diese in Mysql schreiben, irgendwas hab ich aber bei der Pattern falsch eingegeben weil ich als Resultat die Namen mit der Tabelle geliefert bekomme.

PHP:
preg_match_all('/<td class=\"column1\">(.*)<\/td>/isU', $table, $treffer); 
  
  foreach ($treffer as $key => $value) {
	
	foreach ($value as $name) {
	
	echo $name;
	//$insert = "INSERT INTO tabelle (name) values ('$name')";	
	//$db->query($insert);
	}
  }

$name liefert mir <td class="column1">NameXyz</td>

ich brauch aber nur den NameXyz :)
 
Moin,

ich bin kein Regex-Experte, aber ich würde mal das hier versuchen:

PHP:
<?php
$table = <<<EOT
<table class="foo">
	<tr>
		<td class="column1">Zeile1 - Spalte1</td>
		<td class="column2">Zeile1 - Spalte2</td>
	</tr>
	<tr>
		<td class="column1">Zeile2 - Spalte1</td>
		<td class="column2">Zeile2 - Spalte2</td>
</tr>
</table>
EOT;

preg_match_all('/<td class="column1">([^<\/td>].+?)<\/td>/is', $table, $treffer);
array_shift($treffer);

foreach ($treffer as $key => $value) {

	foreach ($value as $name) {

		var_dump( $name );
		//$insert = "INSERT INTO tabelle (name) values ('$name')";
		//$db->query($insert);
	}
}

Du hast den Ungreedy-Modifier eingebaut, den würde ich weglassen, sonst bekommst du ungewollte Resultate.
 
Hast du auch mal den HTML-Source angeschaut? ;)

Ja (siehe Edit :-D), aber trotzdem war die zweite Ausgabe ohne den HTML Teil (es sind ja zwei Gruppen). Also hat sein Code korrekt funktioniert, nur ohne "PREG_SET_ORDER" lässt sich mit Gruppen nicht intuitiv arbeiten.

PHP:
<?php
$table = <<<EOT
<table class="foo">
	<tr>
		<td class="column1">
			Zeile1 - Spalte1
		</td>
		<td class="column2">Zeile1 - Spalte2</td>
	</tr>
	<tr>
		<td class="column1">Zeile2 - Spalte1</td>
		<td class="column2">Zeile2 - Spalte2</td>
	</tr>
</table>
EOT;

preg_match_all('/<td class=\"column1\">(.*)<\/td>/isU', $table, $matches, PREG_SET_ORDER);

foreach($matches as $match) {
	echo $match[1];
	echo "\n";
}
?>
 
Jetzt hab ich aber noch ein kleines Problemchen, wie bekomme ich alles auf einmal in die Mysql Datenbank eingefügt ?

PHP:
 preg_match_all('/<td class=\"column1\">(.*)<\/td>/isU', $table, $column1, PREG_SET_ORDER);
  preg_match_all('/<td class=\"column2\">(.*)<\/td>/isU', $table, $column2, PREG_SET_ORDER);
preg_match_all('/<td class=\"column3\">(.*)<\/td>/isU', $table, $column3, PREG_SET_ORDER);
  
foreach($column1 as $match) {
    
	echo $match[1];
    echo "\n";
	
	$insert = "INSERT INTO tabelle (name) VALUES ('$match[1]')";	
	$db->query($insert);
	
}
 
PHP:
$query = 'INSERT INTO t (name) VALUES ';

foreach($matches as $match) {
	$query = $query."('".mysql_real_escape_string($match[1])."'),";
}

$query = substr($query, 0, strlen($query) - 1);

$query .= ';';

echo $query;
 
Könnte man die preg-Aufrufe nicht zusammen in einen kombinieren, also etwa so:

PHP:
preg_match_all('/<td class=\"column[1-3]\">(.*)<\/td>/isU', $table, $columns, PREG_SET_ORDER);

Dann könntest du dir nämlich auch 3 foreach-Durchläufe sparen ;)
 
Das geht nicht weil die Werte von column1 in eine Datenbank Spalte kommen und die von 2 in die 2te Spalte.

Sonst hab ich ja alle 3 in einer Spalte oder ?
 
Zurück