[PHP] HTML code inlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De onderstaande functie zou alle HTML tags moeten uitlezen.
maar zoals je in de output kan kijken loopt er het een en ander fout...
- achterste stukken vallen weg vanaf ik de offset parameter gebruik voor de stripos() functie
- als de offset meer dan 1 wordt, dan werkt het echt niet meer naar behoren.
zoals je bij derde lijn output zou verwachten zou name="street" moeten zijn.
toch blijven de start en stop (in mijn functie op dezelfde waarde staan)


ik heb op php.net naar commando's aan het zoeken geweest en verschillende forums bekeken. echter zonder resultaat.....

1. Wat zit er fout in mijn functie?
2. hebben jullie een betere manier om dit op te lossen?

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
<?php


 Function GetLine($String, $offset){
        $NewString = stristr ($String, '<');
        $Start = stripos ($NewString, '<',$offset)+1;
        
        $Stop = stripos ($NewString, '>',$offset)-1;
        $outputstring =  "</br>Start: $Start   Stop : $Stop </br>";
        $outputstring .= substr($NewString,$Start, $Stop);
        return $outputstring;
     }

$String .= "<form name=\"login\" action=\"index.php\"  method=\"post\">tzetreez";
$String .= "dqsfsdfsdq<input type=\"text\" name=\"[b]username[/b]\" size=\"2\" maxlength=\"10\">fqfqsdfqsd";
$String .= "<input type=\"text\" name=\"[b]street[/b]\" size=\"4\" maxlength=\"20\">";
$String .= "</form>";


echo "</br>";
 $TotalFormLines = substr_count($String,'<');
echo "aantal lijnen HTML code $TotalFormLines";

 for($i=0;$i<$TotalFormLines;$i++){  
     echo "</br>--------------------------------------------------</br>";
      $LineString = GetLine($String,$i);
     
     //echo $counter++;
    
      
     echo  strip_tags($LineString); //show me the shit
     echo "</br>";
     echo "$i </br>";



output :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
aantal lijnen HTML code 4
--------------------------------------------------
Start: 1 Stop : 51 form name="login" action="index.php" method="post"
0 

--------------------------------------------------
Start: 72 Stop : 51 input type="text" name="[b]username[/b]" size="2" [b]maxlengt[/b]1 

--------------------------------------------------
Start: 72 Stop : 51 input type="text" name="[b]username[/b]" size="2" [b]maxlengt[/b]
2 

--------------------------------------------------
Start: 72 Stop : 51 input type="text" name="[b]username[/b]" size="2" [b]maxlengt[/b]
3

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Regular expressions? :?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<pre>
<?php
$String .= "<form name=\"login\" action=\"index.php\"  method=\"post\">tzetreez";
$String .= "dqsfsdfsdq<input type=\"text\" name=\"[b]username[/b]\" size=\"2\" maxlength=\"10\">fqfqsdfqsd";
$String .= "<input type=\"text\" name=\"[b]street[/b]\" size=\"4\" maxlength=\"20\">";
$String .= "</form>";

preg_match_all("/<([^>]>)/U", $String, $matches);

print_r($matches);
?>
</pre>

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Als je iets meer info wil over waar of de tags staan in de string heb je niet zo heel veel aan een regex. In dat geval zou ik met een functietje als onderstaande door de string heenfietsen:
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
35
36
37
38
39
40
41
42
43
44
45
function findHTML($string) {
    
    //init output array
    $output = array();
    
    //start searching for first tag
    $char = '<';

    $offset = 0;

    //loop trough string to find tag delimiters
    while(($pos = strpos($string, $char, $offset)) !== FALSE) {
        
        //fetch part info;
        $part['start'] = $offset;
        $part['length'] = $pos - $offset;
        $part['type'] = ($char == '<') ? 'out of tag' : 'tag content';
        $part['content'] = substr($string, $part['start'], $part['length']);
        $output[] = $part;
        
        //switch open / close char
        $char = ($char == '<') ? '>' : '<';

        //update offset
        $offset = $pos+1;
    }

    //fetch last part
    $part['start'] = $offset;
    $part['length'] = strlen($string) - $offset;
    $part['type'] = ($char == '<') ? 'out of tag' : 'tag content (string is malformed)';
    $part['content'] = substr($string, $part['start']);

    $output[] = $part;

    return $output;
}

$String .= "<form name=\"login\" action=\"index.php\"  method=\"post\">tzetreez";
$String .= "dqsfsdfsdq<input type=\"text\" name=\"[b]username[/b]\" size=\"2\" maxlength=\"10\">fqfqsdfqsd";
$String .= "<input type=\"text\" name=\"[b]street[/b]\" size=\"4\" maxlength=\"20\">";
$String .= "</form>";

$stringInfo = findHTML($String);
print_r($stringInfo);

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je alvast met een regexp alle losse tags hebt verkregen is jouw functie ook een stukje makkelijker te schrijven. :)

Wat betreft offsets kun je alle posities van de verschillende < tekens apart ophalen en gebruiken.

[ Voor 32% gewijzigd door NMe op 11-04-2006 20:02 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Als offset geef je $i mee wat een strcount voor het aantal '<' karakters is. Je tweede < komt op positie 72 voor en 72 > $i dus logisch dat die offset niet aangepast wordt.

[ Voor 12% gewijzigd door stekkel op 11-04-2006 20:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dat verklaard waarom die functie niet werkt ...


mss toch maar eens die regular expressions van dicht bij bekijken :D

bedankt

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
-NMe- schreef op dinsdag 11 april 2006 @ 20:01:
Als je alvast met een regexp alle losse tags hebt verkregen is jouw functie ook een stukje makkelijker te schrijven. :)

Wat betreft offsets kun je alle posities van de verschillende < tekens apart ophalen en gebruiken.
Zo moeilijk was ie niet te schrijven ;) (van de 37 regels zijn het 10 regels whitespace, 6 regels commentaar en 10 regels over-expliciet output definiëren). Het is vooral een lap code om de stappen expliciet te maken zodat het ook voor "minder ervaren scripters" duidelijk is wat er gebeurd.
Of de boel makkelijker danwel duidelijker wordt als je eerst de tags inleest met een regex (je mist btw nog een * achter de ] ) betwijfel ik. Volgens mij zit je sowieso vast aan een while-strpos-loopje om de beginposities te vinden. En dan kun je daar imho net goed het hele verhaal mee oplossen.
Then again, als het louter om replacen of ueberhaupt vinden van tags gaat is een regex de beste oplossing. Het was/is me alleen niet helemaal duidelijk of de nummering in het voorbeeld in de TS nu debug info is of gewenste informatie :)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Valid HTML:
HTML:
1
<p<b/foo/

:P

Intentionally left blank

Pagina: 1