PHP zoekscript
Ik heb het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$url = $_GET['url'];
$var = open_url($url);
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
$var, &$matches);
$matches = $matches[1];
$list = array();
foreach($matches as $var)
{
$url = $var;
$var = open_url($url);
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>
$url = $_GET['url'];
$var = open_url($url);
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
$var, &$matches);
$matches = $matches[1];
$list = array();
foreach($matches as $var)
{
$url = $var;
$var = open_url($url);
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>
$var, &$matches);
$matches = $matches[1];
$list = array();
foreach($matches as $link)
{
print($link."<br>");
}
}
// De functie
function open_url($url,$ref="")
{
$hfile = fopen($url,"r");
if($hfile){
while(!feof($hfile)){
$html.=fgets($hfile,1024);
}
}
return $html;
}
?>
Een URL die ik opgeef wordt doorlopen op URL's die op hun beurt ook weer doorlopen worden. Echter zijn er enkele problemen.
Hoe kan ik dubbele URL's voorkomen? Dat als een URL al aan de beurt is geweest hij niet nog een x getoond wordt? Hoe kan ik dat als een link bijv <a href="index.php"></a> is dat er dan gekeken wordt naar de host en die voor de url geplaatst wordt? Het kan met replace maar dan moet er gekeken worden of er geen http://blabla.com voor staat... in plaats van kijken of er iets staat en dat replacen.
Hoe kan ik in het script verwerken dat hij niet van een bepaalde domein mag afwijken dus stel ik maak een array("http://www.site1.nl", "http://www.site2.nl") en dan kijken of begin van URL in array voorkomt. Zoja, doorlopen zoniet dan stoppen.
Ga ondertussen zelf aan de slag maar dit waren wat vragen die bij me opkwamen terwijl ik met het script bezig was! Duurde al even voordat ik goed de URL's uit een pagina kon extracten...
Gewijzigd op 01/01/1970 01:00:00 door Shakes
Zie nu ook een fout. Het checkt maar een level dieper... hoe kun je dat oneindig door laten gaan? Dus nu heb ik 1 extra foreach... hoe kun je dat automatiseren (dus niet dat ik 100 foreaches invul) dat hij automatisch steeds een level dieper gaat?
<pre>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$domein = "cc13575-b.groni1.gr.home.nl";
$file = "http://cc13575-b.groni1.gr.home.nl/kcbprojects.php";
function geturls($f){
global $domein;
static $array = array();
static $count = 0;
preg_match_all("/(\"|')((?:http|https):\/\/" . $domein . "(?:(?!\\1).)*)\\1/", file_get_contents($f), $subs, PREG_SET_ORDER);
foreach($subs as $k => $v){
if(!empty($v[2]) && !in_array($v[2], $array)){
$array[] = $v[2];
$count++;
geturls($v[2]);
$count--;
}
}
if($count == 0) return $array;
}
$result = geturls($file);
print_r($result);
?>
$domein = "cc13575-b.groni1.gr.home.nl";
$file = "http://cc13575-b.groni1.gr.home.nl/kcbprojects.php";
function geturls($f){
global $domein;
static $array = array();
static $count = 0;
preg_match_all("/(\"|')((?:http|https):\/\/" . $domein . "(?:(?!\\1).)*)\\1/", file_get_contents($f), $subs, PREG_SET_ORDER);
foreach($subs as $k => $v){
if(!empty($v[2]) && !in_array($v[2], $array)){
$array[] = $v[2];
$count++;
geturls($v[2]);
$count--;
}
}
if($count == 0) return $array;
}
$result = geturls($file);
print_r($result);
?>
</pre>
edit: if(!in_array()) toegevoegd
werkt denk ik zoals je wil
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards
Thanks, ziet er inderdaad goed uit. Vanmiddag even meespelen!
edit: die counter is ook niet nodig voor de return aangezien je $array ook een global kan maken
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards
Hoe kan ik van mijn originele script een functie maken zodat hij continu de volgend url ook doorloopt?
Dus in deze functie:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
function open_url($url,$ref="")
{
$hfile = fopen($url,"r");
if($hfile){
while(!feof($hfile)){
$html.=fgets($hfile,1024);
}
}
return $html;
}
{
$hfile = fopen($url,"r");
if($hfile){
while(!feof($hfile)){
$html.=fgets($hfile,1024);
}
}
return $html;
}
Eigenlijk dit toevoegen:
Code (php)
1
2
3
4
2
3
4
$test = open_url($url);
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>
$test, &$matches);
$matches = $matches[1];
$list = array();
foreach($matches as $var)
{
echo $var;
echo '<br />';
$test = open_url($var);
}
Functies schrijven is niet echt mijn sterkste kant... eigenlijk hoef ik altijd scripts maar eenmaal te gebruiken dus dan is een functie overbodig. Nu moet de functie zich zelf eigenlijk steeds herhalen met de preg_match etc..
je hebt zowiezo een recursive function nodig dus wat jij hier boven hebt staan gaat niet werken
in je bovenste functie geef je $ref aan maar die gebruik je niet..
en zo zitten der een paar andere dingen in die volgens mij niet echt kloppen..
het is nou eenmaal een script dat wat meer tijd kost maar dat die echt vast loopt lijkt me sterk..
edit: ohja nog is over dat je geen herhalende functie wil gebruiken.. dit heb je nodig als je een oneindig aantal pagina's langs wil gaan, anders moet je toch echt met een limiet werken.
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards