[php] ankers uit string filteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi, Ik heb een string die bestaat uit html code. Nou wil ik de ankers uit kunnen lezen van alle hyperlinks die in de string voorkomen. Voorbeeld:

door hier op te klikken
<a name="#anker1">klik hier</a>

gaat hij naar deze hyperlink
<a href="www.ilse.nl" name=anker1>ilse</a>

Nou wil ik dus de name tag anker 1 uitlezen (dus alle ankers in een string met html code).

Wat heb ik geprobeerd:
Ik heb geprobeerd een lus te maken met daarin het commando strpos. Ik vind hierdoor de string <a href= en kijk of er "name=" inde hyperlink voorkomt maar ik kan vervolgens niet doorzoeken naar de volgende string Ma href in de string.

Zijn er commando's die ik kan gebruiken? zoals ereg etc?

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

reguliere expressies.. en ja die kun je gebruiken met ereg :)

zoek eens met Google op "PHP Regular Expressions" :)

[ Voor 5% gewijzigd door Bosmonster op 30-05-2003 16:02 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Bosmonster schreef op 30 mei 2003 @ 16:02:
zoek eens met Google op "PHP Regular Expressions" :)
Of kijk in de P&W FAQ over Regular Expressions.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik kom er niet uit. Word duizelig van de mogelijkheden die ereg heeft. Plus het feit dat ik wel kan zoeken met ereg en soortgelijke commando's , maar hij geeft alleen true en false terug. Geen positie in de doorzochte string, zodat ik verder kan vanaf dat punt.

<a href="www.ilse.nl" name="anker1">ilse</a>

Ik wil in bovenstaand voorbeeld anker 1 uitlezen. Maar de url van de href heeft geen constante lengte, de name tag komt vaker voor in de totale string etc etc. Kan iemand mij anders een klein beetje op weg helpen, of heeft iemand iets soortgelijks gemaakt?

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Je kan ook een kant-en-klare html parser gebruiken. In dat geval werk je als volgt:
- Zet alle tags in een array
- Loop alle tags af en controleer of het type "a" is (een anchor)
- Kijk of er een element "name" in de tag bestaat

Bijvoorbeeld deze kan het: http://www.jazarsoft.com/products/2.php.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben er inmiddels al uitgekomen. No thx. Voor die genen die ooit hetzelfde willen hier de code:
code:
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
35
36
37
38
39
40
41
<?php
  $data = "de string <A HREF=\"http://www.ilse.nl/\" name=\"anker1\">ilse</A> code.";

  unset($location);
  $links = array();  
  $hrefs = array(); 
  $pos = 0;
  while (!(($pos = strpos($data,"<",$pos)) === false)) {
    $pos++;
    $endpos = strpos($data,">",$pos);
    $tag = substr($data,$pos,$endpos-$pos);
    $tag = trim($tag);
    if (isset($location)) {  // look for a </A>
      if (!strcasecmp(strtok($tag," "),"/A")) {
        $link = substr($data,$linkpos,$pos-1-$linkpos);
        $links[] = $link;
        $hrefs[] = $location;
        unset($location);
      }
      $pos = $endpos+1;
    } else {  // look for a <A ...>
      if (!strcasecmp(strtok($tag," "),"A")) {
        if (eregi("name[ \t\n\r\v]*=[ \t\n\r\v]*\"([^\"]*)\"",$tag,$regs));
        else if (eregi("name[ \t\n\r\v]*=[ \t\n\r\v]*([^ \t\n\r\v]*)",$tag,$regs));
        else $regs[1] = "";
        if ($regs[1]) {  // Only use it if it seems to be reasonable
          $location = $regs[1];
        }
        $pos = $endpos+1;
        $linkpos = $pos;
      } else {
        $pos = $endpos+1;
      }
    }
  }


for ($i=0; $i<sizeof($links); $i++) {
    echo "$hrefs[$i] $links[$i]";
  }
?>

[ Voor 13% gewijzigd door Verwijderd op 01-06-2003 11:52 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ik zou zoiets doen:
PHP:
1
2
3
preg_match_all('/<a .*?name=["\']?(.*?)["\']?[ >]/is', $data, $matches);

print_r($matches[1]);

[ Voor 20% gewijzigd door crisp op 01-06-2003 11:58 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Stewie!
  • Registratie: September 2001
  • Laatst online: 12:26

Stewie!

Keen must die!

lekker verschil met zijn code :P

[ Voor 33% gewijzigd door Stewie! op 01-06-2003 12:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ziet er inderdaad leuk uit, maar werkt niet in alle gevallen, de html code die als $data fungeert is niet altijd mooi opgemaakt, soms zonder "" soms met '' etc. Verder is het zo dat je hyperlinks met ankers hebt en gewoon alleen ankers die teksts zijn en geen hyperlink. Ik heb bovenstaand script gerund op een string met html en hij haalt niet alle ankers er uit.

Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
overigens zijn RegEx is heel veel gevallen trager dan hardcoded php code, vooral omdat de engine steeds moet worden opgestart.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb inderdaad problemen met de snelheid. Hij is verrekte traag in het doorlopen van mijn lus.

Acties:
  • 0 Henk 'm!

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07 12:07
Verwijderd schreef op 02 June 2003 @ 13:20:
ik heb inderdaad problemen met de snelheid. Hij is verrekte traag in het doorlopen van mijn lus.
hmm je zoekt op anchors ? (ie <A .....> tags of echt <a name="hello"/> tags ) waarom zoek je dan in godsnaam naar < ? zoek toch op "<a " dan gaat je de loop per html element af? zet ook eens al je variable buiten je while loop ... dat je dan nog eregs gaat gebruiken per loop is ook eeb beetje 'gortig' zoek na je "<a" op "name" dan op " (een <A name=hello> != HTML) nou goed - gebruik php functies all the way through en je zult zien dat het een pak sneller gaat.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanx, ik zal het aanpassen, ik hoop dat het wat scheelt.

Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

Verwijderd schreef op 02 June 2003 @ 13:20:
ik heb inderdaad problemen met de snelheid. Hij is verrekte traag in het doorlopen van mijn lus.
anders met eregi gaan werken.. is sneller dan preg_match_all op lange files
preg_match_all is sneller op 1 regel vergeleken met eregi

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Daar werk ik al mee, zie mijn code aan het begin van mijn post

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 02 June 2003 @ 13:10:
ziet er inderdaad leuk uit, maar werkt niet in alle gevallen, de html code die als $data fungeert is niet altijd mooi opgemaakt, soms zonder "" soms met '' etc. Verder is het zo dat je hyperlinks met ankers hebt en gewoon alleen ankers die teksts zijn en geen hyperlink. Ik heb bovenstaand script gerund op een string met html en hij haalt niet alle ankers er uit.
Daar houd hij rekening mee hoor. En hoe bedoel je hyperlinks met ankers? je hebt een anker, of een link naar een anker.

anker:

<a name="anker">text</a>

link naar anker:

<a href="#anker">link naar anker</a>

verzamel alle name attributen uit de <a> tags en je hebt alle ankers toch?

[ Voor 12% gewijzigd door crisp op 02-06-2003 15:18 ]

Intentionally left blank

Pagina: 1