Toon posts:

[PHP] string uit file filteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$GrabURL = "http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&amp;cluster_id=40";  
$GrabStart = '<A HREF>';
$GrabEnd = '</A>'; 

$file = fopen("$GrabURL", "r");
while (!feof($file)) 
    {
    $start= strpos($file, "<A HREF=");  
    $finish= strpos($file, "</A>");  
    $length= $finish-$start;  
    $code=Substr($file, $start, $length);  
    echo $code;
    }  
?>

Ik wil dus alle adressen die in het bestand (http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&cluster_id=40) uitlezen, om deze waarden daarna weer te gebruiken of als headlines weer te geven. Ik ben al een paar dagen bezig, maar ik kom er niet uit. Kan iemand helpen?

Verwijderd

Topicstarter
Ik zal eerst eens een Time Limit instellen, want nu gaat ie van Fatal error: Maximum execution time of 30 seconds exceeded in /..../grab_id.php on line 12

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 23-07 15:18

Tim

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$fp = file('bestandsnaam');
$regex = {VOEG HIER REGEX IN VOOR URL};

foreach($file as $line) {
  preg_match_all($regex, $line, $match);
  foreach($match as $url_found) {
    $result[count($result)] = $url_found[1];
  }
}
?>

Beetje spelen met regexen dus :)

Verwijderd

Topicstarter
Op dinsdag 02 oktober 2001 22:01 schreef Timpie2000 het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$fp = file('bestandsnaam');
$regex = {VOEG HIER REGEX IN VOOR URL};

foreach($file as $line) {
  preg_match_all($regex, $line, $match);
  foreach($match as $url_found) {
    $result[count($result)] = $url_found[1];
  }
}
?>

Beetje spelen met regexen dus :)
Kun je dat even uitleggen aub?

Verwijderd

Topicstarter
Ik heb weer een nieuwe code :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$open = fopen("http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&amp;cluster_id=40", "r");
$read = fread($open, 15000);
fclose($open);

$search = eregi("<TR><TD><font face=\"Geneva, Arial, Helvetica, sans-serif\" size=\"2\">(.*)</TD><TD>&amp;nbsp;</TD></TR>", 

$read, $printing);

$printing[1] = str_replace("message.php?", "http://xp.fnv.nl/fnv/ns02/message.php?", $printing[1]);
$content = $printing[1];
$content = explode("&amp;#183;", $content);

$headlines = sizeof($content);

for ($i = 0; $i < $headlines; $i++) {

print "Bericht (Nummer : ".($i+1).") : $content[$i]<BR>";

}
?>

Deze werkt, nou ja voor de eerste regel, maar de rest van de pagina wordt gewoon weergegeven. Ik snap er niets meer van.

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Deze werkt:
PHP:
1
2
3
4
5
6
7
<?
$file = implode("", file("http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&amp;cluster_id=40"));
preg_match_all("/(<(A|a)[^>]*>)(.*)(<\/(A|a)>)/", $file, $match);
for ($i=0; $i< count($match[0]); $i++) {
    echo $match[0][$i]."<br>\n";
}
?>

Verwijderd

Topicstarter
Op dinsdag 02 oktober 2001 23:38 schreef GraasGast het volgende:
Deze werkt:
PHP:
1
2
3
4
5
6
7
<?
$file = implode("", file("http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&amp;amp;cluster_id=40"));
preg_match_all("/(<(A|a)[^>]*>)(.*)(<\/(A|a)>)/", $file, $match);
for ($i=0; $i< count($match[0]); $i++) {
    echo $match[0][$i]."<br>\n";
}
?>
Dank je wel
Dank je wel!

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Graag gedaan ;)

  • tomato
  • Registratie: November 1999
  • Niet online
Op dinsdag 02 oktober 2001 23:38 schreef GraasGast het volgende:
Deze werkt:
PHP:
1
2
3
4
5
6
7
<?
$file = implode("", file("http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&amp;amp;amp;cluster_id=40"));
preg_match_all("/(<(A|a)[^>]*>)(.*)(<\/(A|a)>)/", $file, $match);
for ($i=0; $i< count($match[0]); $i++) {
    echo $match[0][$i]."<br>\n";
}
?>
Ja, maar hoe :D

Ik weet niet of je het expres gedaan hebt (dan heb ik niks gezegd ;) ), maar je hoeft * nu niet ungreedy te maken alleen maar omdat de file() functie alle regels in een array teruggeeft met de newline erbij en een . (punt) geen newlines matcht (en omdat alle adressen op een nieuwe regel staan in het HTML document)!
En het is makkelijker en vooral leesbaarder om een /i modifier te gebruiken in plaats van voor alle letters een alternation te gebruiken (wat dan nog altijd mooier met een character class zou gaan).
En waarom al die haken? En wat wil MeneerPeer eigenlijk precies? Een url, of een link-tag inclusief url?

Zoiets lijkt me logischer:
code:
1
/<a href="([^"]+)">(.+?)<\/a>/is

Waarbij je de url in $1 en de omschrijving in $2 vindt...

[edit] typo

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

tomato laat z'n regex-spierballen zien hoor! :P patser! ;)

ik heb ook maar een beetje lopen knippen, plakken en veranderen aan die regex uit de manual, verder niks...ik ben (nog?) geen regex goeroe :)

  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 03 oktober 2001 00:04 schreef GraasGast het volgende:
tomato laat z'n regex-spierballen zien hoor! :P patser! ;)
Dit is nog niks :7 :+
ik heb ook maar een beetje lopen knippen, plakken en veranderen aan die regex uit de manual, verder niks...ik ben (nog?) geen regex goeroe :)
Was ook absoluut niet als aanval bedoeld, ik hoop hoogstens dat iemand nog iets opsteekt van de op- en aanmerkingen die ik maakte ;)

Verwijderd

tomato: En waarom al die haken? En wat wil MeneerPeer eigenlijk precies? Een url, of een link-tag inclusief url?
Denk dat hij de titels met bijbehorende links wil hebben? :?

Dus zoiets voor de links lijkt me voldoende (geen quotes om de URL want die staan er in de source ook niet):
code:
1
/<a href=([^>]+)>/is

Of flexibeler (single, double en zonder quotes of met een ontbrekende quote):
code:
1
/<a href=['"]?([^'">]+)['"]?>/is

Verwijderd

Topicstarter
Op woensdag 03 oktober 2001 02:03 schreef Arien het volgende:

[..]

Denk dat hij de titels met bijbehorende links wil hebben? :?

Dus zoiets voor de links lijkt me voldoende (geen quotes om de URL want die staan er in de source ook niet):
code:
1
/<a href=([^>]+)>/is

Of flexibeler (single, double en zonder quotes of met een ontbrekende quote):
code:
1
/<a href=['"]?([^'">]+)['"]?>/is

MeneerPeer wil eingelijk alleen de adressen, dus ook geen <A HREF=... Ik wil die adressen namelijk weer gebruiken om de complete artikelen in te lezen.

Verwijderd

Topicstarter
Die adressen is dus geen probleem, maar nu wil ik die adressen weer openen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
    $file = implode("", file("http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&amp;cluster_id=40"));
    $url  = "http://xp.fnv.nl/fnv/ns02/";
    

    // preg_match_all("/(<(A|a)[^>]*>)(.*)(<\/(A|a)>)/", $file, $match);
    preg_match_all("/<a href=([^>]+)>/is", $file, $match);

    for ($i=0; $i< count($match[0]); $i++) 
    {    
        $match[0][$i] = str_replace("<A HREF=", "<A HREF=http://xp.fnv.nl/fnv/ns02/", $match[0][$i]);
        $match[0][$i] = str_replace("<A HREF=", "", $match[0][$i]);
        $match[0][$i] = str_replace(">", "", $match[0][$i]);
        $match[0][$i] = str_replace("http://xp.fnv.nl/fnv/ns02/[MESSAGE_URL]", "http://dynaweb.nl/index.htm", 

$match[0][$i]);


        echo $match[0][$i]."<br>\n";
        $file = $match[0][$i];
        $OpenFile = fopen("$file", "r"); 
        $RetrieveFile = fread($OpenFile, 200000);  //- Reduce This To Save Memory
        echo $Retrievefile;

    }
?>

Maar dat werkt niet?

Verwijderd

MeneerPeer: MeneerPeer wil eingelijk alleen de adressen, dus ook geen <A HREF=... Ik wil die adressen namelijk weer gebruiken om de complete artikelen in te lezen.
Ik denk dat MeneerPeer nu wel weer zelf na kan denken... |:(

Verwijderd

Topicstarter
Op woensdag 03 oktober 2001 08:42 schreef Arien het volgende:

[..]

Ik denk dat MeneerPeer nu wel weer zelf na kan denken... |:(
Is MeneerPeer zeker mee bezig. Bedankt voor jullie tips trouwens!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Op woensdag 03 oktober 2001 02:03 schreef Arien het volgende:
code:
1
/<a href=['"]?([^'">]+)['"]?>/is
Moet die dan niet met een backreference?
Want de eerste 'quotesoort' moet wel de laatste matchen ;) (of mag dat niet conditioneel, wel toch?)
Het mooiste zou dan zijn, dat je in de [^'">] dan ook diezelfde backreference kon gebruiken ;)

[edit]
In dit geval gaat het natuurlijk wel goed, omdat er gewoon geen quotes in voor mogen komen in die match ;)

Verwijderd

ACM: Moet die dan niet met een backreference?
ja, volgens de spec wel, maar het is brakke HTML dus om het flexibel te houden :) (en aangezien je toch geen quotes in een URL kan gebruiken...)
Het mooiste zou dan zijn, dat je in de [^'">] dan ook diezelfde backreference kon gebruiken ;)
Zie boven, zijn sowieso niet legaal in een URL ;)

En ja, het is mooier vanuit HTML oogpunt maar omdat je niet de HTML maakt maar alleen maar (zo ruim mogelijk) wilt matchen leek me dit wel een mooie oplossing.

Verwijderd

Topicstarter
Ik krijg de volgende fout:
Warning: Supplied argument is not a valid File-Handle resource
uit een vorig Got/14 Topic :
Warning: Supplied argument is not a valid File-Handle resource ....

En weer hetzelfde probleem. Je kunt een file niet openen, en dat geeft deze errors. Of de file bestaat niet, of je hebt de webserver geen toestemming gegeven die file te lezen.
Maar met een controle laat php zien dat de file wel bestaat.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?
    $file = implode("", file("http://xp.fnv.nl/fnv/ns02/thread.php?forum_id=7&amp;amp;cluster_id=40"));
    $url  = "http://xp.fnv.nl/fnv/ns02/";
    

    // preg_match_all("/(<(A|a)[^>]*>)(.*)(<\/(A|a)>)/", $file, $match);
    preg_match_all("/<a href=([^>]+)>/is", $file, $match);

    for ($i=0; $i< count($match[0]); $i++) 
    {    
        $match[0][$i] = str_replace("<A HREF=", "<A HREF=http://xp.fnv.nl/fnv/ns02/", $match[0][$i]);
        $match[0][$i] = str_replace("<A HREF=", "", $match[0][$i]);
        $match[0][$i] = str_replace(">", "", $match[0][$i]);
        $match[0][$i] = str_replace("http://xp.fnv.nl/fnv/ns02/[MESSAGE_URL]", "http://dynaweb.nl/index.htm", 

$match[0][$i]);


        // echo $match[0][$i]."<br>\n";
        $file = $match[0][$i];
        
        $OpenFile = fopen("$file", "r"); 
        if ($file)
            { print"The file exists!"; }
        else
        { print"The file does not exist"; }

        $RetrieveFile = fread($OpenFile, filesize ($file));  //- Reduce This To Save Memory
        fclose($file);
        echo $Retrievefile;


    }
?>

Sorry, MeneerPeer denkt zeker zelf na, maar komt er niet uit.

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

Op woensdag 03 oktober 2001 01:22 schreef tomato het volgende:

[..]

Dit is nog niks :7 :+
tomato gaat binnenkort op m'n icq lijst staan, groepje 'helpdesk' :P
[..]

Was ook absoluut niet als aanval bedoeld, ik hoop hoogstens dat iemand nog iets opsteekt van de op- en aanmerkingen die ik maakte ;)
ja dat snap ik ook wel hoor :) ik probeerde alleen uit te leggen waarom het zo onlogisch in mekaar zat...

maar iets opsteken, graag, altijd...regex is handig, maar wel moeilijk ;(
Pagina: 1