[php] regex werkt, maar niet bij hele grote strings

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
edited:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

$filename = "test.tmp";
$handle = fopen ($filename, "r");
$txt = fread ($handle, filesize ($filename));
fclose ($handle);

$header=$txt;
$content=$txt;
//$regexp = "/HTTP\/1.x 200 OK(.*)<http>(.*)<\/http>/i";
$regexp = '/^([^<]*)(.*)$/';
$header = preg_replace($regexp, "\\1", $header);
$content = preg_replace($regexp, "\\2", $content);

echo "de header is: ".$header."<br>";
echo "de content is: ".$content;
?>
Deze code werkt als ik het probeer met een klein voorbeeldje, maar als ik het dan in het echt probeer toe te passen laat een steekje vallen
(de bedoeling is om de headers van de html-content te scheiden)

Met dit voorbeeld lukt het dus wél:
HTML:
1
2
3
4
5
6
7
8
9
HTTP/1.x 200 OK
Cache-Control: private
Content-Type: text/html
Content-Encoding: gzip
Server: GWS/2.1
Content-Length: 1412
Date: Wed, 27 Jul 2005 15:02:03 GMT

<html>teeeeest</html>


maar met een echt voorbeeld (dus met html code etc. erin) blijkt het niet te werken: hij geeft voor zowel $header als $content gewoon de originele $txt (alsof er geen regex staat)
test.tmp =
HTML:
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
HTTP/1.x 200 OK
Cache-Control: private
Content-Type: text/html
Content-Encoding: gzip
Server: GWS/2.1
Content-Length: 1412
Date: Wed, 27 Jul 2005 15:02:03 GMT

<html>

<head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Google</title><style><!--
body,td,a,p,.h{font-family:arial,sans-serif;}
.h{font-size: 20px;}
.q{color:#0000cc;}
//-->
</style>
<script>
<!--
function sf(){document.f.q.focus();}
// -->
</script>
</head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onLoad=sf() topmargin=3 marginheight=3><center><table cellpadding=0 cellspacing=0 border=0><tr><td align=right valign=bottom>[img]images/hp0.gif[/img]</td><td valign=bottom>[img]images/hp1.gif[/img]</td><td valign=bottom>[img]images/hp2.gif[/img]</td></tr><tr><td class=h align=right valign=top><b></b></td><td valign=top>[img]images/hp3.gif[/img]</td><td valign=top class=h><font color=#6f6f6f style=font-size:16px><b>België</b></font></td></tr></table><br>
<form action=/search name=f><script><!--
function qs(el) {if (window.RegExp && window.encodeURIComponent) {var ue=el.href;var qe=encodeURIComponent(document.f.q.value);if(ue.indexOf("q=")!=-1){el.href=ue.replace(new RegExp("q=[^&$]*"),"q="+qe);}else{el.href=ue+"&q="+qe;}}return 1;}
// -->
</script><table border=0 cellspacing=0 cellpadding=4><tr><td nowrap><font size=-1><b>Het&nbsp;Internet</b>&nbsp;&nbsp;&nbsp;&nbsp;<a id=1a class=q href="/imghp?hl=nl&tab=wi" onClick="return qs(this);">Afbeeldingen</a>&nbsp;&nbsp;&nbsp;&nbsp;<a id=2a class=q href="/grphp?hl=nl&tab=wg" onClick="return qs(this);">Discussiegroepen</a>&nbsp;&nbsp;&nbsp;&nbsp;<a id=3a class=q href="/dirhp?hl=nl&tab=wd" onClick="return qs(this);">Gids</a>&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="/intl/nl/options/" class=q>meer&nbsp;&raquo;</a></b></font></td></tr></table><table cellspacing=0 cellpadding=0><tr><td width=25%>&nbsp;</td><td align=center><input type=hidden name=hl value=nl><input maxLength=256 size=55 name=q value=""><br><input type=submit value="Google zoeken" name=btnG><input type=submit value="Ik doe een gok" name=btnI></td><td valign=top nowrap width=25%><font size=-2>&nbsp;&nbsp;<a href=/advanced_search?hl=nl>Geavanceerd zoeken</a><br>&nbsp;&nbsp;<a href=/preferences?hl=nl>Voorkeuren</a><br>&nbsp;&nbsp;<a href=/language_tools?hl=nl>Taalhulpmiddelen</a></font></td></tr><tr><td colspan=3 align=center><font size=-1>Zoek: <input id=all type=radio name=meta value="" checked><label for=all> het Internet</label><input id=lgr type=radio name=meta value="lr=lang_nl" ><label for=lgr> pagina's in het Nederlands</label><input id=cty type=radio name=meta value="cr=countryBE" ><label for=cty>pagina's uit  België</label></font></td></tr></table></form><br><font size=-1><font color=#ff0000>Nieuw! </font><a href="http://toolbar.google.com/firefox/T3/intl/nl/">Google Toolbar voor Firefox</a>.</font><br><br>Google.be aangeboden in: <a href="http://www.google.be/fr">Français</a>  <a href="http://www.google.be/de">Deutsch</a>  <a href="http://www.google.be/en">English</a> <br>&nbsp;<br><br><font size=-1><a href=/intl/nl/ads/>Advertentie programma's</a> - <a href=/intl/nl/services/>Bedrijfsoplossingen</a> - <a href=/intl/nl/about.html>Alles over Google</a> - <a href=http://www.google.com/ncr>Google.com in English</a></font><p><font size=-2>&copy;2005 Google - Zoekt in 8.058.044.651 webpagina's</font></p></center></body>

</html>

[ Voor 116% gewijzigd door Verwijderd op 27-07-2005 17:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom doe je dan niet dit:

PHP:
1
$regexp = '/^([^<]*)(.*)$/';


Waarbij \\1 de header is en \\2 de content.

edit: dit werkt niet, ik ga even een goede code fixen.

[ Voor 24% gewijzigd door Verwijderd op 27-07-2005 16:54 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

En wat gaat er nou precies mis dan? Leuk dat je je code laat zien, en zegt dat het niet werkt, maar daar kunnen we niets mee. ;) Wat werkt er niet? Wat werkt er wel? Kortom, lees P&W FAQ - De "quickstart" even door en pas je startpost aan. :)

'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
wordt de header en de content doorgaans niet gescheiden door de eerst voorkomende \r\n\r\n sequence?

Zo ja dan kan je toch veel beter met behulp van strpos en substr de header en content scheiden?
Bovendien is het ook nog eens veel sneller aangezien regular expressions erg traag worden bij grote strings.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Het newline-teken valt standaard niet onder de . (wildcard). Pas als je er een s modifier bijplaatst gebeurt dat.

Voor het uitlezen van de header is trouwens stekkel's reactie wel zinvol, je zou ook zoiets kunnen doen als regexp: /([^\r\n]*\r\n)+\r\n(.*)/s lijkt me wat veiliger om de header van de content te scheiden.

[ Voor 36% gewijzigd door ACM op 27-07-2005 18:37 ]