ugrás a tartalomhoz

PHP-val HTML oldal BODY részének kiszedése

Topi · 2006. Jan. 24. (K), 16.32
Sziasztok!

A feladat a következő. Van egy oldal, ahol egy cikk adatbázisban van eltárolva. És szeretném, hogy a címm szerkesztője fel tudjon tölteni egy bárhol bármivel megszerkesztett html oldalt. Az a rész beg is van.
Csak az elejéről le kellene csapni minden felesleges dolgot, és csak a <body> </body> közötti részt kellene majd beleírni az sql-be.
Szóval addig kész vagyok, hogy egy stringben ott a file full tartalma.
Hogyan tovább? Van egy egyszerű ötletetek rá? preg_replace el próbálkozom épp most, de nem igazán vezet eredményre!

Üdv. Topi.
 
1

Reguláris kifejezés

Anonymous · 2006. Jan. 24. (K), 17.06
Én tudom javasolni a http://www.weitz.de/regex-coach/ címen található reguláris kifejezések kezelésére szolgáló prg-t. Ezzel interaktívan ki tudod próbálni, hogy mit találna meg a ereg() fv. Én is bajlódtam egy időben ilyennel, és sikerrel.

Üdv: Viktor
2

<Nincs cím>

-zsolti- · 2006. Jan. 24. (K), 17.12
Nekem eddig ment, majd valaki még összerakja egybe:

$body = '<html><body><p>akármi</p><br><i>valami</i>bármi</body></html>';

$body = preg_replace('/(.*?)<body>/', '', $body);
$body = preg_replace('/<\/body>(.*)/', '', $body);

echo $body;


Üdvözlettel: Liebig Zsolt
SWEN INTERNET
3

Egyszerűbb megoldás

suexID · 2006. Jan. 24. (K), 17.32
Rossz helyen keresgélsz. A regex nem partner jelen esetben, sokkal inkább az strpos() és a substr() függvények kellenének neked.

Az strpos-zal rákeresel a <body> sztringre, majd megkapod a pozícióját, ehhez hozzáadsz 6-ot. Ezek után ismét futtatsz egy strpos-t, ezúttal a </body> sztringet keresed meg. A második értékből kivonod az elsőt, majd a substr függvényt futtatod, első paraméterként az első strpos() értékét megadva, második értékként pedig az előbbi kivonás értékét beírva. Nagyjából ennyi.
4

A megoldás

Topi · 2006. Jan. 24. (K), 18.22
Nah azzal a progival sikerült nagyon jó kis kifejezést alkotni...

Leírom:

A body kiszedéséhez:
(<body(.*)>)([^°]*)(<\/body>)



A css kiszedéséhez:
(<style(.*)type="text\/css"(.*)>)([^°]*)(<\/style>)


Az a strpos - substr párossal próbálkoztam, de nem biztos hogy <body> van.. lehet hogy <body bgcolor="#000000"> és azt meg strpossal bonyi lenne.. Ezért adtam fel..
5

<Nincs cím>

-zsolti- · 2006. Jan. 24. (K), 18.26
Közben én is összeraktam, bár nem tudom mennyire jó:

echo preg_replace('/(.*)<body(.*?)>(.*?)<\/body>(.*)/ie', "('\\3')", $body);

Üdvözlettel: Liebig Zsolt
SWEN INTERNET
8

<Nincs cím>

Topi · 2006. Jan. 24. (K), 19.32
most így néz ki...
<?php
 $f = fopen("alma.html","r");
 $html = fread($f,filesize("alma.html"));
 fclose($f);

 $sokchr = " a-zA-Z0-9=\"\r\n#();";
 
 $body = "";
 $tmp = preg_split("/(<body ([$sokchr]*)>)/i",$html);
 if (count($tmp) > 1) {
$tmp = preg_split("/(<\/body>)/i",$tmp[1]);
$body = $tmp[0];
 }
 
 $style = "";
 $tmp = preg_split("/(<style([$sokchr]*)type=\"text\/css\"([$sokchr]*)>)/i",$html);
 if (count($tmp) > 1) {
$tmp = preg_split("/(<\/style>)/i",$tmp[1]);
$style = $tmp[0];
 }
 print (trim($body));
?>

Szerintem túlbonyolítottam, de nem tudom egyszerűbben megírni, és ez most megy!

A te változatodat is próbáltam, de valahogy nekem nem működött... Mit rontottam el?
9

<Nincs cím>

-zsolti- · 2006. Jan. 24. (K), 20.13
Semmit, én rontottam el: csak akkor működik, ha egy sorban van az egész. Tehát ki kéne még küszöbölni a \n eket. Mindegy hagyjuk, nem megy ez nekem :-)

Üdvözlettel: Liebig Zsolt
SWEN INTERNET
10

<Nincs cím>

toxin · 2006. Jan. 26. (Cs), 10.13
jó ez szvsz csak a /e -t nem értem minek ellenben egy /s -már törpéletes :)

s (PCRE_DOTALL)

If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. This modifier is equivalent to Perl's /s modifier. A negative class such as [^a] always matches a newline character, independent of the setting of this modifier.

http://hu.php.net/manual/hu/reference.pcre.pattern.modifiers.php

szóval ...'/(.*)<body(.*?)>(.*?)<\/body>(.*)/si'...


ui: programajánló : http://www.regexbuddy.com/
6

<Nincs cím>

suexID · 2006. Jan. 24. (K), 18.30
Az a strpos - substr párossal próbálkoztam, de nem biztos hogy <body> van.. lehet hogy <body bgcolor="#000000"> és azt meg strpossal bonyi lenne.. Ezért adtam fel..

Bocs, ezt el is felejtettem, mivel én minden formázást CSS-ből csinálok. Akkor tényleg célravezetőbb a regex.
7

<Nincs cím>

Topi · 2006. Jan. 24. (K), 19.25
én is külön css fájlból csinálom, csak mikor valaki cikket ír, akkor a html fájlban van benne az esetleges formázás...
11

az is jó

Anonymous · 2006. Jan. 26. (Cs), 11.21
sztem a te megoldásod is jó úgy, hogy a <body szövegre keresünk rá, nem <body> -ra. vagy a <body szöveg utáni első > karakterre. persze látva a regex-es megoldásokat, talán tényleg egyszerűbbek.

egyébként nem csak formázás lehet a body elemben, hanem onload esemény is.

gex
12

a példa

Anonymous · 2006. Jan. 26. (Cs), 11.48

$text='<html><head><title>cím</title></head><bODy meg sok okosság><div id="wrapper"><div id="content">sok<br>sok<br>tartalom<br>gagyi<br>kóddal</div><div id="header">Oldal címe</div></div></BODY>itt is lehet szöveg</html>';
$start=strpos(strtolower($text),"<body")+strpos(substr($text,strpos(strtolower($text),"<body")),">")+1;
$end=strpos(strtolower($text),"</body>");
print(substr($text,$start,($end-$start)));
gex

(a colorer=php furcsán színezi a kódot)
13

OFF: colorer

attlad · 2006. Jan. 26. (Cs), 12.34
(a colorer=php furcsán színezi a kódot)

Mivel PHP kódot pl. <?php és ?> nyitó/záró jelek közé kell tenni, a fenti algoritmust a PHP értelmező se fogja futtatni.