webForumDet fria alternativet

Vad gör jag fel???

PHP

10 svar · 533 visningar · startad av Fredde Mannen

Medlem sedan nov. 20014 054 inlägg
Frågan#1

Jag har denna kod:

<?php

$fd = fopen("http://www.linux.se/index.php","r");

if(!$fd) {
echo "Kan inte upprätta en anslutning!";
exit;
}

$line="";
$ret="";

while (!feof($fd))
  {
		 $line = fgets($fd, 1024);
		if(eregi("<A HREF=\"/news/readnews.php?ID=(.*)&CLICK=(.*)\">(.*)</A>",$line,$out)) 
			{
			$ret.="<a href=\"/news/readnews.php?ID=$out[1]&CLICK=$out[2]\">$out[3]</a><br>";
			} else {
				$ret = "no matches";
			}
  }

fclose($fd);
echo $ret;
?>

den skall hämta nyhetslänkarna från www.linux.se, men sidan blir blank... var är mitt fel... någonstans i regexpen br det vara, men jag hittar dt inte!!! HELP!!!

Medlem sedan juli 2002630 inlägg
#2

Du gör många fel. Ett av dom är i den här raden

$ret = "no matches";

Så fort det kommer en rad som inte uppfyller din regexp så nollställs din $ret-variabel till värdet "no matches".

Även om du får in en massa "rätta" svar från din regexp nollställs din $ret-variabel om det inte finns ett "rätt svar" på sista raden.

Medlem sedan nov. 20014 054 inlägg
#3

sabbacus skrev:

Du gör många fel. Ett av dom är i den här raden

$ret = "no matches";

Så fort det kommer en rad som inte uppfyller din regexp så nollställs din $ret-variabel till värdet "no matches".

Även om du får in en massa "rätta" svar från din regexp nollställs din $ret-variabel om det inte finns ett "rätt svar" på sista raden.

<?php

$fd = fopen("http://www.linux.se/index.php","r");

if(!$fd) {
echo "Kan inte upprätta en anslutning!";
exit;
}

$line="";
$ret="";

while (!feof($fd))
  {
         $line = fgets($fd, 1024);
        if(eregi("<A HREF=\"/news/readnews.php?ID=(.*)&CLICK=(.*)\">(.*)</A>",$line,$out)) 
            {
            $ret.="<a href=\"/news/readnews.php?ID=$out[1]&CLICK=$out[2]\">$out[3]</a><br>";
            } 
  }

fclose($fd);
echo $ret;
?>

okay.. har plockat bort den.. men det blir inget förrändrat resultat, mer än att nu visas inget "no matches"..

Kan du hjälpa mig lite på traven TACK!!! :q

Medlem sedan juli 2002630 inlägg
#4

Jag har suttit och svurit i en halvtimma nu och kommit en del på vägen. Koden nedan fungerar delvis, men eregi() fungerar bara till en viss del. Förstår inte varför. Någon som kan förklara varför man inte kan skriva text efter ? i eregi-uttrycket?

<?

$fd = fopen( "http://www.linux.se/index.php", "r" );

if ( !$fd )
{

	echo "Kan inte upprätta en anslutning!";

	exit();

}

$line = "";

$ret = "";

$count = 0;

while ( !feof( $fd ) )
{

	$line = fgets( $fd, 1024 );

	// Din ursprungliga eregi()
	//if(eregi("<A HREF=\"/news/readnews.php?ID=(.*)&CLICK=(.*)\">(.*)</A>",$line,$out)) 
	

	// Den här funkar för mig, får 29 träffar
	if ( eregi( "<a href=\"/news/readnews.php?", $line, $out ) )
	
	/* När jag lägger till ett I (stort som litet) får skriptet helt plötsligt noll träffar, trots att bokstaven finns där efter en titt i källkoden */
	//if ( eregi( "<a href=\"/news/readnews.php?I", $line, $out ) )
    {

//en smaksak egentligen. Jag separerar variablerna från strängen så att jag ser vart dom är. Skrev också 'id' och 'click' med gemener.
		$tmp = "<a href=\"/news/readnews.php?id=" . $out[1] . "&amp;click= " . $out[2] . "\">" . $out[3] . "</a>\n<br>\n";

		/* debug */
		//echo $line . "<br />";
		//echo $tmp;
		//echo "<br />";
		/* debug */

		$ret .= $tmp;

		$count++;
	}

}

if ( sizeof( $ret ) == 0 )
{
	$ret = "no matches";
}
else 
{
	echo $count . " matches.";
}

fclose( $fd );

echo $ret;

?>
Medlem sedan okt. 20023 030 inlägg
#5
<?php

$fd = fopen("http://www.linux.se/index.php","r");

if(!$fd) {
echo "Kan inte upprätta en anslutning!";
exit;
}

$line="";
$ret="";

while (!feof($fd))
  {
         $line = fgets($fd, 1024);
        if(eregi("<A HREF=\"/news/readnews.php?ID=(.*)&CLICK=(.*)\">(.*)</A>",$line,$out)) 
            {
            $ret.="<a href=\"/news/readnews.php?ID=$out[1]&CLICK=$out[2]\">$out[3]</a><br>";
            } else {
                if (empty($ret))
                    $ret = "no matches";
            }
  }

fclose($fd);
echo $ret;
?>

Har dock inte testat men det bör fungera.

Medlem sedan juli 2002630 inlägg
#6

Nexus: Får "no matches" med din kod, bara så att du vet :)

Medlem sedan okt. 20023 030 inlägg
#7

Nej men det är ju fel i uttrycket. På http://www.linux.se/ står det en massa efter href i länkarna. :)

Byt ut:

if(eregi("<A HREF=\"/news/readnews.php?ID=(.*)&CLICK=(.*)\">(.*)</A>",$line,$out))

// mot

if(eregi("<A HREF=\"/news/readnews.php?ID=(.*)&CLICK=(.*)\"(.*)>(.*)</A>",$line,$out))
Medlem sedan okt. 20023 030 inlägg
#8

R// Det ville inte heller funka. Försöker komma på en annan lösning. :r

Medlem sedan nov. 20014 054 inlägg
#9

Nexus86 skrev:

R// Det ville inte heller funka. Försöker komma på en annan lösning. :r

Ingen fara, jag fixedixade med liten ändring i sabbacus kod..

<?

$fd = fopen( "http://www.linux.se/index.php", "r" );

if ( !$fd )
{

    echo "Kan inte upprätta en anslutning!";

    exit();

}

$line = "";

$ret = "";

$count = 0;

while ( !feof( $fd ) )
{

    $line = fgets( $fd, 1024 );

    //Min ursprungliga eregi() ändrade jag till detta och får träffar..

    if(eregi("<A HREF=\"/news/readnews.php(.*)\">(.*)</A>\n",$line,$out)) 
    

    // Den här funkar för mig, får 29 träffar
    //if ( eregi( "<a href=\"/news/readnews.php?", $line, $out ) )
    
    /* När jag lägger till ett I (stort som litet) får skriptet helt plötsligt noll träffar, trots att bokstaven finns där efter en titt i källkoden */
    //if ( eregi( "<a href=\"/news/readnews.php?I", $line, $out ) )
    {

//en smaksak egentligen. Jag separerar variablerna från strängen så att jag ser vart dom är. Skrev också 'id' och 'click' med gemener.
        $tmp = "<a href=\"http://www.linux.se/news/readnews.php" . $out[1] . "\">" . $out[2] . "</a>\n<br>\n";

        /* debug */
        //echo $line . "<br />";
        //echo $tmp;
        //echo "<br />";
        /* debug */

        $ret .= $tmp;

        $count++;
    }

}

if ( sizeof( $ret ) == 0 )
{
    $ret = "no matches";
}
else 
{
    echo $count . " matches.";
}

fclose( $fd );
echo $ret;
?>

Script in action: http://www.mkd.nu/news.php

Medlem sedan okt. 20023 030 inlägg
#10

Och det när jag just fått till det med din kod. :o :)

<?php

$fd = fopen("http://www.linux.se/index.php","r");

if(!$fd) {
echo "Kan inte upprätta en anslutning!";
exit;
}

$line="";
$ret="";

while (!feof($fd))
{
	$line .= fgets($fd, 1024);
}

fclose($fd);

if (preg_match_all("/<A HREF=\"\/news\/readnews\.php\?ID=(.*?)&CLICK=(.*?)\" TARGET=\"_blank\" TITLE=\"(.*?)\">(.*?)<\/A>/i", $line, $out, PREG_SET_ORDER))
{
	for ($i = 0; $i < count($out) ; $i++)
	{
		$ret.="<a href=\"/news/readnews.php?ID={$out[$i][1]}&CLICK={$out[$i][2]}\">" . str_replace("<BR>", "", $out[$i][4]) . "</a><br>";
	}
}
else
{
    $ret = "no matches";
}

echo $ret;
?>

R// Fast HAHA! Min ger adresser utan radbrytningar. :e

R2// Valde att spara hela filen i $line istället för bara 1024 tecken för annars kan det hända att man bryter mitt i en länk och då kommer inte den med.

Medlem sedan nov. 20014 054 inlägg
#11

Nåja.. men det löste sig ialla fall.... :) Skadar aldrig med att det finns två varianter! :) en men eregi och en med preg_match! :e

270 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)