[PHP]waardes uit string halen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Ik heb een newssubmitter gemaakt, waarmee je nieuwsberichten kunt voorzien van plaatjes, headers, dikgedrukte tekst enz. Dit wordt in z'n geheel in een mysql database gezet.

Ik heb een aparte tabel voor m'n images, en ik plaats in de newstabel steeds het id van de foto wanneer ik die gebruik. Een nieuwsbericht kan er in de tabel dus als volgt uitzien:

id: 15
userid: 1
title: Titel
summary: Inleiding
message: Bericht[image=14][header=tekst][bold=tekst][italic=tekst]
date: 2004-04-07 17:43:21
imageid: 14

(imageid is het id van de foto die ik op de voorpagina wil hebben)
Wanneer ik een foto in de tekst gebruik, dan doe ik dit met [image=14] bijvoorbeeld. Mijn vraag is nu, hoe kan ik nu het beste (makkeljikste) die waarde 14 uit de string halen, en gebruiken om de foto uit de database te halen en in html in te voegen? Hetzelfde verhaald voor de tekst in de header, bold en italic tags.

Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Regular Expressions gebruiken :)

Zoek eens op preg_replace en consorten :)

Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 19:39
PHP:
1
$var=substr($image, 7,2);


ervanuitgaande dat $var "[image=14]" bevat en het getal altijd 2 tekens bevat.

Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
418O2 schreef op 07 april 2004 @ 18:15:
PHP:
1
$var=substr($image, 7,2);


ervanuitgaande dat $var "[image=14]" bevat en het getal altijd 2 tekens bevat.
En ervan uitgaande dat de tekst altijd alleen uit "Bericht" bestaat :? :X

Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 19:39
mhh :+ niet aan gedacht :)

Maar inderdaad met ereg_replace moet je wel een end komen..

Hoe haal je dit precies op? Wat is de precieze inhoud van de string waaruit je deze gegevens haalt?

Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
ik haal gewoon een hele string uit de database. Dat kan nogal een lap tekst zijn natuurlijk, en daar staat dus op willekeurige plaatsen ooit eens een keer [img=2] ofzo. De bedoeling is dus dat ie het patroon [img=...], [header=...], [bold=...] en [italic=...] herkent, en dat de waarde op de plaats van de ... uitgelezen wordt. Het lijkt erop dat ik daar inderdaad preg_match_all voor moet gebruiken. Ff verder lezen hoe dat precies moet...

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

regexp \\[(.*)\]

explode('[',$string);

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Wanneer je het record 'bericht' wijzigt in onderstaande; dan kan PHP er vanuit zichzelf al mee overweg:

code:
1
image=14&header=tekst&bold=tekst&italic=tekst


Lijkt enigzins op de GET-methode, werkt ongeveer hetzelfde.

Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Hmm, dat is niet echt de oplossing die ik zoek. Ik moet toch met regexp's aan de gang denk ik, maar het is behoorlijk lastig om daar in ineens middenin te duiken. De syntax is behoorlijk onduidelijk.

Acties:
  • 0 Henk 'm!

  • Diabolus
  • Registratie: November 2003
  • Laatst online: 23-06 09:36
Ik zou het met strpos en substr doen, zoiets als dat hieronder staat:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?PHP

$str = 'Bericht[image=14][header=tekst][bold=tekst][italic=tekst]';

$start = 0;

while ( is_int ( $start = strpos ( $str, '[', $start ) ) )
{
    $start++;
    $pos  = strpos ( $str, '=', $start );
    $name = substr ( $str, $start, $pos - $start );

    if ( $name == 'image' )
    {
        $spos = $pos + 1;
        $epos = strpos ( $str, ']', $pos );
        $id   = substr ( $str, $spos, $epos - $spos );
    }
}

echo $id; // Laat 14 zien als het goed is.

?>

Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Ik ben met de reguliere expressies bezig, maar het is behoorlijk lastig.
ik heb nu dit:

code:
1
2
3
$html = "message: Bericht[image=14][header=tekst][bold=tekst][image=16]";
preg_match_all('/\\[image\=(.+?)\]/', $html, $matches);
print_r($matches[1]);


Dan krijg ik als output: Array ( [0] => 14 [1] => 16 ) Das dus goed.
Nu wil ik daarnaast dus ook die reguliere expressies voor [header=...] enz. Ik heb dit gedaan:

code:
1
preg_match_all('/\\[image\=(.+?)\]|\\[header\=(.+?)\]/', $html, $matches);


Maar dan krijg ik dit als ik $matches[2] laat zien:
Array ( [0] => [1] => tekst [2] => )
Dat klopt wel redelijk, maar ik krijg deels lege termen in de array. Hoe krijg ik die nu weg?

[ Voor 13% gewijzigd door Dr_Frickin_Evil op 08-04-2004 00:19 ]


Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Ik heb nu dit:
code:
1
preg_match_all("/<image=(\d+)>|<header=(.*)>|<bold=(.*)>|<italic=(.*)>/U", $html, $out);

En krijg dit als output:
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
Array
(
    [0] => Array
        (
            [0] => <image=14>
            [1] => <header=tekst>
            [2] => <bold=tekst>
            [3] => <image=16>
            [4] => <italic=tekst>
        )

    [1] => Array
        (
            [0] => 14
            [1] => 
            [2] => 
            [3] => 16
            [4] => 
        )

    [2] => Array
        (
            [0] => 
            [1] => tekst
            [2] => 
            [3] => 
            [4] => 
        )

    [3] => Array
        (
            [0] => 
            [1] => 
            [2] => tekst
            [3] => 
            [4] => 
        )

    [4] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
            [4] => tekst
        )

)

Precies wat ik moet hebben dus eigenlijk. Maar nu is de vraag, hoe kan ik dit array dat ik nu terugkrijg ik het beste gebruiken om de html aan te passen? Gewoon opnieuw de tekst doorzoeken naar deze strings, die strings verwjideren, en de aangepaste string invoegen? Of is er een elegantere methode?

Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
nevermind, het werkt prima :D heb de functie preg_replace_callback gebruikt.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Dr_Frickin_Evil schreef op 08 april 2004 @ 18:29:
nevermind, het werkt prima :D heb de functie preg_replace_callback gebruikt.
zet de oplossing er dan ook even bij, wel zo prettig als iemand anders dit ooit eens wil weten

btw hoezo callback?
was dat nodig dan?

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Oja sure:

Zo roep ik hem aan:
code:
1
$read_message = preg_replace_callback('/\[image=(\d+)\]|\[header=(.*)\]|\[bold=(.*)\]|\[italic=(.*)\]/U','replaceCallback',$read_message);


en dit is de functie 'replaceCallback':
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
function replaceCallback($matches) {
    $replace = array ('image', 'header', 'bold', 'italic');
    for ($i = 1; $i < sizeof($matches); $i++) {
        if(!empty($matches[$i])) {
            if ($replace[$i - 1] == 'image') {
                $image_query = "SELECT * FROM images where id='$matches[$i]'";
                $image_result = mysql_query($image_query);
                $number = mysql_num_rows($image_result);     
                $image_row = mysql_fetch_object($image_result); 
                if($number == '1') {
                    $image_userid = $image_row->userid;
                    $image_filename = $image_row->filename;
                    $image_title = $image_row->title;
                    $image_date = $image_row->date;
                    $image_directory = $image_row->directory;
                    }
                else
                    die ("Image not found");
                return "\n[img]\"$image_directory$image_filename\"[/img]";
                }
            elseif ($replace[$i - 1] == 'header')
                return "\n<h3>$matches[$i]</h3>";           
            elseif ($replace[$i - 1] == 'bold')
                return "\n<div class=\"bold\">$matches[$i]</div>";
            elseif ($replace[$i - 1] == 'italic')
                return "\n<div class=\"italic\">$matches[$i]</div>";
            }
        }
    }

Als iemand nog dingen ziet om het te verbeteren, let me know!

[ Voor 15% gewijzigd door Dr_Frickin_Evil op 08-04-2004 19:17 ]

Pagina: 1