webForumDet fria alternativet
Logga in / Bli medlem

Preg_match_all

PHP

2 svar · 198 visningar · startad av ZeUs

Medlem sedan nov. 200188 inlägg
Trådstart#1

Tjenare..
Jag sitter med ett script som jag kodade före sommaren. Det används för att extrahera ut vårt schema från http://schema.hj.se/visa.asp?from=2003-09-08&tom=&prog=Dm3+++&kurs=&lokal=&larare=&visap=Nej&bolag=ING för att senare kunna använda det i exempelvis Outlook/PDA.
Funkar hyfsat men det är en sak som brister... När det är flera lektioner samma tid på samma dag så plockar scriptet bara ut den första lektionen.
så här ser koden ut...

<?php
$datum = date("Y-m-d");
$url = "http://schema.hj.se/visa.asp?from=$datum&tom=&prog=Dm3+++&kurs=&lokal=&larare=&visap=Nej&bolag=ING";
function getPageCode($url){
	$data=0;
	if(!($fp = fopen ($url, "r")))
	{
		die("Cannot connect to: $url");
	}

	while ($in = fread($fp, 4096))
	{
		$data .= $in;
	}

	return $data;
}

$host = "localhost";
$user = "Andreas";
$password = "";
$dbname = "schema";
$link = mysql_connect ($host, $user, $password);
$sql2="DELETE FROM `schema` " or die(mysql_error());
mysql_db_query ($dbname, $sql2, $link);
mysql_close ($link);
$link2 = mysql_connect ($host, $user, $password);
$code = getPageCode($url);
preg_match_all("/(<form>\s*.*<+form>\s)/mis", $code, $matches);
$nystrang = $matches[1][0];

preg_match_all("/\s*<TD VALIGN=\"TOP\" ALIGN=\"LEFT\" class=\"brodtext\">(\d*-\d*-\d*)&nbsp;\s(\w*)&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\d+:\d+)-(\d+:\d+)&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\w*)\s*&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\w*)\s*&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">([A-Za-z\s]*)&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\w\d\d\d)\s*[A-Za-z-]*\s*&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\w*)&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">([\w\s\/]*)&nbsp;<\/TD>\s*<TD VALIGN=\"TOP\" class=\"brodtext\">\s(\w*)&nbsp;\s*<\/TD>/mis", $nystrang, $matches2);
for ($i=0; $i< count($matches2[1]); $i++) {
       $sql="INSERT INTO schema(datum, dag, start, slut, program, kurs, grupp, sal, sign, moment) VALUES ('".$matches2[1][$i]."','".$matches2[2][$i]."','".$matches2[3][$i]."','".$matches2[4][$i]."','".$matches2[5][$i]."','".$matches2[6][$i]."','".$matches2[7][$i]."','".$matches2[8][$i]."','".$matches2[9][$i]."','".$matches2[10][$i]."')" or die(mysql_error());
        mysql_db_query($dbname, $sql, $link2) or die(mysql_error()); 
	}
//}
mysql_close($link2);
?>

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
informationen har sparats...
</body>
</html>

Koden från schema sidan är strukturerat uppbyggd:

<form>
      <TD VALIGN="TOP" ALIGN="LEFT" class="brodtext">2003-09-10&nbsp; Ons&nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext">13:00-16:45&nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext">Dm3   &nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext">Datgraf &nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext">1  &nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext">E440  
&nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext">RuAn&nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext">Laboration
      &nbsp;</TD>
      <TD VALIGN="TOP" class="brodtext"> &nbsp; 
</TD>
</form>

Snälla kan någon hjälpa mig?
Kan det vara någon preg_match_all egenskap eller liknande som jag missat?

Medlem sedan aug. 20002 975 inlägg
#2

Tror snarare det är så att du inte får med de rader där Grp består av en siffra.

Testa det här (om nu inget rensas bort när jag sparar inlägget)

preg_match_all("/\\s*<TD VALIGN=\"TOP\" ALIGN=\"LEFT\" class=\"brodtext\">(\\d*-\\d*-\\d*)&nbsp;\\s(\\w*)&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\\d+:\\d+)-(\\d+:\\d+)&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\\w*)\\s*&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\\w*)\\s*&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\\w*)\\s*&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\\w\\d\\d\\d)\\s*[A-Za-z-]*\\s*&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">(\\w*)&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">([\\w\\s\\/]*)&nbsp;<\\/TD>\\s*<TD VALIGN=\"TOP\" class=\"brodtext\">\\s(\\w*)&nbsp;\\s*<\\/TD>/is", $nystrang, $matches2);
Medlem sedan nov. 200188 inlägg
#3

Mycket riktigt!
Nu fungerar det... Tack så mycket för hjälpen

394 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
123 ms — deklarationer (db)
133 ms — hämta statistik (db)
136 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)