[PHP] selectie van html bestand naar variabele

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Ik ben absoluut geen expert in php en zit met het volgende vraagstuk.
Ik heb op php.net de filesystem en string function lijsten nagekeken, maar kan er nog niet verder mee.
Ik heb een stukje code :

code:
1
2
3
$url = "http://www.mijnurl.nl/index.html";
$contents = file_get_contents($url);
print $contents;


Nu wil ik echter alleen de tekst in het html bestand hebben die tussen <pre></pre> tags staat. HOE kan ik zoiets selecteren .. of omgekeerd de rest weggooien uit de variabele $contents ?

Acties:
  • 0 Henk 'm!

  • R_W
  • Registratie: Oktober 2002
  • Niet online

R_W

Kijk eens op php.net naar Regular Expressions.

Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Daar word ik niet echt wijzer van.
Is er geen duidelijk manier te noemen? Een regel code ofzo waar ik van kan leren.

Moet echt even op weg geholpen worden.

Acties:
  • 0 Henk 'm!

Verwijderd

Regular Expressions kan ik niet maar wil het nog wel eens gaan leren :) , dit zal zeker sneller gaan dan onderstaande.

zo kan het ook dit is wat begrijpelijker:

Ik ga er vanuit dat <pre></pre> niet meerdere keren voorkomen in de $contents string de onderstaande functie pakt namelijkt de eerst voorkomende string.

zoek de positie van de strings <pre> en </pre> in de $contents string met:
http://nl.php.net/manual/nl/function.strpos.php

En selecteer de tekst hier tussen met:
http://nl.php.net/manual/nl/function.substr.php


en klaar is kees :) , en nu de php code om deze 2 functies nog :)


Als je deze sites had bezocht: http://nl.php.net/quickref.php of www.php.net had je het misschien zelf ook kunnen oplossen. ;)

[ Voor 98% gewijzigd door Verwijderd op 01-04-2004 22:18 ]


Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Zo kan ik inderdaad de eerste <pre> vinden en hetgeen wat ervoor komt laten verdwijnen. Echter, als ik hem de </pre> laat zoeken zo .. dan mag hij NIET alles wat ervoor staat weghalen .. maar moet hij alles wat ERNA komt weghalen .. beetje lastig dus.
Ik heb het opgelost om in de procedure de string een keer helemaal om te draaien. Kun je es kijken of dat een beetje 'mag' .. of is het een mega-wazige oplossing?? Hij werkt in ieder geval wel.

code:
1
2
3
4
5
6
7
8
9
<?php
$url = "http://www.knmi.nl/voorl/weer/weeroverzicht.html";
$contents = file_get_contents($url);
$contents = strstr ($contents, '<pre>');
$contents = strrev($contents); 
$contents = strstr ($contents, '>erp/<');
$contents = strrev($contents); 
print $contents;
?>

Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-09 12:54
BoXie schreef op 01 april 2004 @ 21:27:
Daar word ik niet echt wijzer van.
Is er geen duidelijk manier te noemen? Een regel code ofzo waar ik van kan leren.

Moet echt even op weg geholpen worden.
Hier in de PW FAQ staat een goede tutorial met linkjes naar uitgebreidere tut's over Regular Expressions.

Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Bedankt mensen,

Heerlijk is dat .. die behulpzaamheid tussen 'computermensen' onderling !

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
code:
1
$contents = substr($contents, strpos($contents, "<pre>") + 5, strpos($contents, "</pre>") - strpos($contents, "<pre>"));


Dit is een stuk netter.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Hmm .. kijk .. dat wist ik dus niet .. dat je string van elkaar kan aftrekken !

Dank je .. ga het meteen proberen

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$contents .= "Dit is een onnozele tekst en slaat nergens op <pre>";
$contents .= "Deze tekst moeten we selecteren</pre>Dit is";
$contents .= "Dit is een onnozele tekst en slaat nergens op";

# Zoek de postitie van '<pre>' eigenlijk pos van '<':
$begTag_pos = strpos($contents, '<pre>');
$begTag_pos = $begTag_pos+5; //offset voor de positie na de '>'

# Zoek de postitie van '</pre>' eigenlijk pos van '<':
$endTag_pos = strpos($contents, '</pre>');

$contents = substr($contents, $begTag_pos, ($endTag_pos-$begTag_pos));

echo $contents;


Met wat uitleg over wat er nu allemaal gebeurd ;)

je trekt de stings niet van elkaar af maar de positie van een bepaalde string in de contents string.

code van Grijze Vos:
PHP:
1
$contents = substr($contents, strpos($contents, "<pre>") + 5, strpos($contents, "</pre>") - strpos($contents, "<pre>"));

moet worden:
PHP:
1
$contents = substr($contents, strpos($contents, "<pre>") + 5, strpos($contents, "</pre>") - (strpos($contents, "<pre>")+5));

[ Voor 118% gewijzigd door Verwijderd op 01-04-2004 22:35 ]


Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Ok bedankt !

Hoop dat ik snel eens wat terug kan doen aan de mensen hier ;)
Maar moet nog veel leren.

Het resultaat is hopelijk snel te zien op www.nieuwsupdate.nl bij 'WEER'.

(probeer de voorspelling van KNMI erin te zetten .. dat mag nl. van hun).

[ Voor 43% gewijzigd door BoXie op 01-04-2004 22:32 ]


Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Is het zo niet makkelijker
PHP:
1
2
3
4
5
6
7
8
9
10
<?

$url = "http://www.mijnurl.nl/index.html";
$contents = file_get_contents($url);

preg_match("|<pre>(.*)</pre>|", $contents, $resultaat);

print_r($resultaat);

?>

Wat het doet is heel simpel. Het zoekt naar een patroon waarin <pre> en </pre> voorkomt. De haakjes zeggen PHP: "Sla op wat hiertussen staat". Een punt betekent een onbekend teken. Met de ster maak je van "onbekend teken" -> Onbekend aantal tekens". Normaal mag dat volgens mij niet, maar omdat je 2 patronen zoekt mag het wel.

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

Verwijderd

LoL waar zijn de Regular Expressions tutorials :9~, dat moet ik dan maar eens vlug gaan leren :)

ik begin hier maar eens: http://gathering.tweakers.net/forum/list_messages/741008

[ Voor 90% gewijzigd door Verwijderd op 01-04-2004 22:40 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

dual-zip schreef op 01 april 2004 @ 22:31:
[...]
Een punt betekent een onbekend teken. Met de ster maak je van "onbekend teken" -> Onbekend aantal tekens". Normaal mag dat volgens mij niet, maar omdat je 2 patronen zoekt mag het wel.
mag niet is een groot woord, maar hou rekening met greediness ;)

[ Voor 6% gewijzigd door crisp op 01-04-2004 22:51 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Zou je is uit kunnen leggen wat dat is crisp?

SandStormer, een hele goede turorial vind je hier :)

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

crisp schreef op 01 april 2004 @ 22:49:
[...]

mag niet is een groot woord, maar hou rekening met greediness ;)
daar is .*? weer goed voor :)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Waarom zou je een 'dure' preg_match over een hele lap tekst heen gooien, als je net zo goed met str_posses hetzelfde kunt bereiken?

Oh, en die kleine typo in mn code, thx voor het fixen. (Was ff vergeten de +5 mee te kopieren. :))

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

dual-zip schreef op 01 april 2004 @ 22:55:
Zou je is uit kunnen leggen wat dat is crisp?

SandStormer, een hele goede turorial vind je hier :)
Donders ja en nog in het Nederlands ook _/-\o_ _/-\o_

[ Voor 3% gewijzigd door Verwijderd op 01-04-2004 23:14 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Grijze Vos schreef op 01 april 2004 @ 23:13:
Waarom zou je een 'dure' preg_match over een hele lap tekst heen gooien, als je net zo goed met str_posses hetzelfde kunt bereiken?

Oh, en die kleine typo in mn code, thx voor het fixen. (Was ff vergeten de +5 mee te kopieren. :))
ik tel bij jou al 3x een strpos en een substr; ik denk dat als je op die manier meerdere instances wilt gaan zoeken je uiteindelijk met een regexp nog wel eens goedkoper uit kan zijn ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
crisp schreef op 01 april 2004 @ 23:17:
[...]

ik tel bij jou al 3x een strpos en een substr; ik denk dat als je op die manier meerdere instances wilt gaan zoeken je uiteindelijk met een regexp nog wel eens goedkoper uit kan zijn ;)
Je kunt een strpos uitsparen he, dat ten eerste. Verder, denk ik niet dat hier meerdere instances gezocht gaan worden, dus, gaat dat argument niet op.

Verder, benchmarken?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Grijze Vos schreef op 01 april 2004 @ 23:21:
[...]


Je kunt een strpos uitsparen he, dat ten eerste. Verder, denk ik niet dat hier meerdere instances gezocht gaan worden, dus, gaat dat argument niet op.

Verder, benchmarken?
Ik denk dat jouw manier voor een enkele occurence inderdaad nog wel sneller is, maar het is wel interessant te weten of het bij meerdere occurences (2, 10, 100 etc) ook nog sneller is dan:

PHP:
1
2
preg_match_all('/<pre>(.*?)<\/pre>/', $langetext, $resultaat);
print_r($resultaat[1]);


je hebt in ieder geval een stuk meer code nodig ;)

[ Voor 6% gewijzigd door crisp op 01-04-2004 23:28 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$contents .= "Dit is een onnozele tekst en slaat nergens op <pre>";
$contents .= "Deze tekst moeten we selecteren</pre>Dit is";
$contents .= "Dit is een onnozele tekst en slaat nergens op";

// START PARSE TIME
$parseT_start = array_sum(explode(' ', microtime()));

$contents_res = substr($contents, strpos($contents, "<pre>") + 5, strpos($contents, "</pre>") - (strpos($contents, "<pre>")+5));

//preg_match("|<pre>(.*?)</pre>|", $contents, $contents_res);

// GENERATE PARSE TIME
$parseT_exec = array_sum(explode(' ', microtime())) - $parseT_start;
$parseT_exec = round($parseT_exec, 4);

echo "Parsetime : ".$parseT_exec;


output:
bovenste methode(r8): "Parsetime : 0.0001" (5.1975250244141E-005)
onderste methode(r10): "Parsetime : 0.0002" (0.00018095970153809)

pfff wat een verschil ;) (en dat op een AMD 3200+)

Tussen de haakjes is wel erg psies >:)

[ Voor 90% gewijzigd door Verwijderd op 01-04-2004 23:46 ]


Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Gaaf dit _/-\o_ !

Wordt er beetje gepraat over hoe 'duur' de aangedragen oplossingen zijn.
(in termen van cpu tijd nee ik aan?). Schitterend !

Erg interessant allemaal .. ook al gaat het bij mij natuurlijk maar om een simpel html bestandje.

Ik ga de 'verbeterde' Grijze Vos 'methode' gebruiken. Mede omdat ik hem nu helemaal snap (met die pointer-movements).
Regular expressions is het eerste waar ik me in ga verdiepen, want heb inderdaad de indruk dat dat veel code kan besparen .. en ik het nog vaak nodig zal hebben.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

voor meerdere occurences met pointers:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$string = '<pre>bla</pre>tra<pre>lala</pre>';
$results = array();

$i = strpos($string, '<pre>');
while ($i !== false) {

  $i += 5;
  $j = strpos($string, '</pre>', $i);
  if ($j === false) break;

  $results[] = substr($string, $i, $j - $i);
  $i = strpos($string, '<pre>', $j + 6);

}

print_r($results);

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

BoXie schreef op 01 april 2004 @ 23:39:
Gaaf dit _/-\o_ !

Wordt er beetje gepraat over hoe 'duur' de aangedragen oplossingen zijn.
(in termen van cpu tijd nee ik aan?). Schitterend !
.
nee harde seconden om de code uit tevoeren ook wel parsetime. Als je tweakers.net laat dat staat er in je statusbalk ook een tijd das ook de parsetime.

Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Hmm .. das een mooie om te onthouden.

En als je nou zeg maar 'de 5de' occurence wilt hebben ?
Dus de tekst tussen de 5de <pre> tags ?

Hoe ziet het model er dan uit? Dit is nl. erg makkelijk om later om te bouwen tot iets algemeens wat voor allerlei tags is te gebruiken.

[ Voor 5% gewijzigd door BoXie op 01-04-2004 23:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

De results array wordt op volgorde van occurence gevuld, neem ik aan.

dus:
PHP:
1
2
$results[0] = //1e occurence
$results[1] = //2e occurence 


algemeen iets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function find_occurence($begin_tag, $end_tag, $string, $which_oc = -1)
{
  $results = array();
  $begin_tag_len = strlen($begin_tag);
  $end_tag_len = strlen($end_tag);

  $i = strpos($string, $begin_tag);
  while ($i !== false)
  {
    $i += $begin_tag_len;
    $j = strpos($string, $end_tag, $i);
    if ($j === false) break;

    $results[] = substr($string, $i, $j - $i);
    $i = strpos($string, $begin_tag, $j + $end_tag_len);
  }

  if($which_oc != -1)
    return $results[$which_oc]; // return string bepaalde occurence
  else
    return $results; // return array met alle occurences
}


functie lijkt het te doen :)

ik ben een echte copy/paste programmeur :)

[ Voor 96% gewijzigd door Verwijderd op 02-04-2004 14:37 ]


Acties:
  • 0 Henk 'm!

  • BoXie
  • Registratie: Juni 2001
  • Laatst online: 30-03-2023
Geweldig !!

Die ga ik meteen bewaren !

Acties:
  • 0 Henk 'm!

Verwijderd

BoXie schreef op 02 april 2004 @ 00:32:
Geweldig !!

Die ga ik meteen bewaren !
ik ook :)
Pagina: 1