[php][regexp]Alles tussen een HTML tag grabben.

Pagina: 1
Acties:

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025
Om de content die tussen een tag staat te grabben gebruik ik deze functie:
PHP:
1
2
3
4
5
6
7
8
9
10
<?
function grabtag($tag)
{
if (eregi("<$tag>(.*)</$tag>", $text, $out))
    {
      $result = $out[1];
    }
return ($result);
}
?>

Maar... dit werkt uiteraard alleen voor <title> en <b> tags enzo.

Zodra een tag er bijv. zo uit ziet:
code:
1
<p align="center">blaat</p>

werkt dit al niet meer.

Ik heb al gezocht naar wat regexp tuts, maar word er nog niet erg wijs van...

Na de
PHP:
1
2
3
<?
eregi("<$tag
?>

moet dus nog iets staan dat alle characters tot > negeert.

Welke regexp freak kan me uitleggen wat ik moet toevoegen om dit te laten werken?

Stop uploading passwords to Github!


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Ik zou zoiets proberen:
PHP:
1
2
3
4
5
6
7
8
9
10
<?
function grabtag($tag)
{
if (eregi("<$tag([:blank:][:alnum:]=[\"\']?[^=<>\'\"][\"\']?)*>(.*)</$tag>", $text, $out))
    {
      $result = $out[2];
    }
return ($result);
}
?>

Als je ut wat specifieker wilt hebben, kijk dan ff hier

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
<?
function grabtag($tag){
    if (eregi("<$tag[[:space:]]+.*>(.*)</$tag>", $text, $out)){
        $result = $out[1];
    }

    return ($result);
}
?>

Ik ben niet goed in reguliere expressies maar het is het proberen waard.

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025
Op dinsdag 05 februari 2002 19:13 schreef RealGamer het volgende:
PHP:
1
2
3
4
5
6
7
8
9
<?
function grabtag($tag){
    if (eregi("<$tag[[:space:]]+.*>(.*)</$tag>", $text, $out)){
        $result = $out[1];
    }

    return ($result);
}
?>

Ik ben niet goed in reguliere expressies maar het is het proberen waard.
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in /home/sites/site2/web/word.php on line 5
* SchizoDuckie ziet de fout niet :? die bovenste doet niets b.t.w.

Stop uploading passwords to Github!


  • tomato
  • Registratie: November 1999
  • Niet online
Euh... moet het ook werken met genestte tags? Dat kan namelijk niet met een (statische) reguliere expressie.

En hoe precies moet het volgens de XHTML specs werken? Hoe belangrijk is snelheid?

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025
Op dinsdag 05 februari 2002 19:22 schreef tomato het volgende:
Euh... moet het ook werken met genestte tags? Dat kan namelijk niet met een (statische) reguliere expressie.

En hoe precies moet het volgens de XHTML specs werken? Hoe belangrijk is snelheid?
Ik zal de hele grap even uitleggen:


hier staat de output van een php script dat een word doc omzet naar HTML m.b.v. wvHtml

Ik heb de XML file van wvHtml al enigzins aangepast, maar er komen ook nog lege <p> 's in te staan.

Die wil ik er dus uit filteren (hoeft maar eenmalig, wordt daarna opgeslagen) met een regexp die me de content van alle <p*></p> 's teruggeeft in een arraytje :) (als dat kan :X )

Stop uploading passwords to Github!


  • tomato
  • Registratie: November 1999
  • Niet online
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
s/

   #########################################################
   #
   #   Empty <p> tag substitution
   #
   #   Quick Hack (tm) not by Arien but by tomato
   #
   #########################################################

   <[pP]                # Begin of opening 'p' tag

    (?:

       # Allow optional attributes in the 'p' tag

       \s+            # Start with space

       # Different types of attributes,
       # open brackets for alternation

       (?:

        # Doublequoted attribute

        [^=]+=        # Attribute and the = sign
        "            # Opening quote

           [^"\\]*      # Normal
           (?:
            \\.      # Special
            [^"\\]*  # Normal
           )*

        "            # Closing quote (escaped)

       |  # OR
        # Singlequoted attribute

        [^=]+=        # Attribute and the = sign
        '            # Opening quote

           [^'\\]*      # Normal
           (?:
            \\.      # Special
            [^'\\]*  # Normal
           )*

        '            # Closing quote

       |  # OR
        # non-quoted attribute

        [^\s>]+      # Anything but space or >

       )                # Close alternation

       # End of attribute, allow it zero or more times

    )*

    \s*              # Optional spaces

   >                    # End of opening 'p' tag

   # Only allow whitespace charachters inside the tag

   \s*

   <\/[pP]>            # Closing 'p' tag

   #########################################################
   #
   #   End of pattern
   #
   #########################################################

//xg;

Geloof dat dit wel zou moeten werken, je moet hem alleen even omzetten in een PHP string (let op escapes, gebruik bij voorkeur enkele quotes).

Ik hoop dat ik het juist begrepen heb dat je alle <p> tags wilt vervangen wanneer er niets of alleen whitespaces tussen staan.

Enige 'bugje' zou je kunnen zien in de eventuele spaties om <p> tags heen die wel blijven staan.

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025
[b]Op dinsdag 05 februari 2002 20:04 schreef tomato een hele dikke regexp waar * SchizoDuckie niets van snapte
Hmmz... die krijg ik al helemaal niet aan de praat :+ :{

* SchizoDuckie denkt dat ie maar een functie gaat bouwen met strpos('<p', startpos); die de tags afloopt.


Thx enieweejs.

Stop uploading passwords to Github!


  • tomato
  • Registratie: November 1999
  • Niet online
Nou vooruit, dit is hem in PHP geworden (inclusief voorbeeldje):
PHP:
1
2
3
4
5
6
7
<?
$s = '<p></p> hoi hoi hoi <p>hoi</p> hoi <p hoi=hoi mai="mai \"mai\" mai" mai=\'mai\'>   </p> hoi hio';
$p = '/<[pP](?:\s+(?:[^=]+="[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|[^=]+=\'[^\'\\\\]*(?:\\.[^\'\\\\]*)*\'|[^\s>]+))*\s*>\s*<\/[pP]>/';
$r = '';

echo preg_replace($p, $r, $s);
?>

:)

  • tomato
  • Registratie: November 1999
  • Niet online
Uiteraard is een XPath oplossing hier vele malen eenvoudiger (voor mbravenboer het gaat zeggen) ;)

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025
Nadat ik óók na de super uitgebreide code van Tomato naar de vuilnisbak heb moeten verwijzen omdat ik niets/weinig terug kreeg, ben ik maar met simpele str_replaces gaan werken.

De uiteindelijke code om een word document in te lezen en om te zetten naar deze schone html:
je moet wel wvware geinstalleerd hebben


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
 $text = `/usr/local/bin/wvWare -x '/usr/local/share/wv/wvHtml.xml' -d '/tmp/' 'path/naar/Slikstoornissen.doc'`; 
  
 while (strpos($text, '<b></b>') !== false) {$text = str_replace('<b></b>', '', $text);} 
 while (strpos($text, "\n</p>") !== false) {$text = str_replace("\n</p>", "</p>", $text);} 
 while (strpos($text, "\">\n") !== false) {$text = str_replace("\">\n", "\">", $text);} 
 while (strpos($text, '"></p>') !== false)  
      {  
           $close = strpos($text, '"></p>'); 
           $pos = strrpos(substr($text,0,$close),"<p"); 
           $length = ($close - $pos) + 6; 
           $text = str_replace( substr($text, $pos, $length) , '', $text); 
      } 
 while (strpos($text, "\n\n") !== false) {$text = str_replace("\n\n", "\n", $text);} 
  
 echo($text);
 
?>

Thx iedereen voor de moeite!!!!

edit:
gelijk maar ff in de codebase gepost :)

Stop uploading passwords to Github!

Pagina: 1