Avatar billede jansangill Nybegynder
18. maj 2009 - 21:53 Der er 4 kommentarer og
1 løsning

preg_replace problem

Hej

Nu er jeg ikke den store haj til regulat expressions, så smider lige noget kode, og så kommer spørgsmålet:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
$indhold = {googleSimple 26 width=70% height=200px};
preg_match('/\{googleSimple\s*(.*?)\}/is', $indhold, $matches)

.....andet indhold bleh blah

$params = process($matches);

function process($matches)
{

    if (preg_match('/width=(\d+)/', $matches[1], $matches2)) $width = $matches2[1];
    if (preg_match('/height=(\d+)/', $matches[1], $matches2)) $height = $matches2[1];
   
    $param_google = new stdClass;
    $param_google->width = $width;
    $param_google->height = $height;

    return $param_google;
}


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dette virker næsten, men ikke helt.

Når jeg skriver param_google->width ud, så får jeg 70 og ikke 70%.
Når jeg skriver param_google->heightud, så får jeg 200 og ikke 200px.

Hvad er der galt med min preg_match?
Avatar billede acore Ekspert
18. maj 2009 - 22:34 #1
Du mangler simpelthen noget, der matcher den sidste del, og derfor kommer den ikke med.

Nu kan der normalt stå andet end % og px, så måske skal du også tage højde for det?

Noget i stil med:

    if (preg_match('/width=(\d+%¦in¦cm¦mm¦em¦ex¦pt¦pc¦px)/', $matches[1], $matches2)) $width = $matches2[1];
    if (preg_match('/height=(\d+%¦in¦cm¦mm¦em¦ex¦pt¦pc¦px)/', $matches[1], $matches2)) $height = $matches2[1];

skulle kunne gøre det. Princippet er, at de muligheder, du vil kunne håndtere, skal listes med | imellem.

Du skal formentlig justere mere, hvis du også vil kunne håndtere en eller flere blanke mellem tallet og enheden, men lad os tage en ting ad gangen.
Avatar billede jansangill Nybegynder
18. maj 2009 - 23:11 #2
Når jeg prøver på dette, så skriver den slet ikke noget ud.

if (preg_match('/width=(\d+%¦in¦cm¦mm¦em¦ex¦pt¦pc¦px)/', $matches[1], $matches2)) $width = $matches2[1];

udskriver ikke noget.

Det der ville være bedst var hvis man havde indhold som dette her:

$indhold = {googleSimple 26 width="70%" height="200px"};

så fandt min preg_match indholdet inden for width, hvor de 2 gåseøjn er, ligemeget hvad der står der.
Avatar billede acore Ekspert
19. maj 2009 - 10:46 #3
Ja, det kan jeg se. Nu har du indført gåseøjne, og jeg har "testet" med denne her:

<?php
$indhold = "{googleSimple 26 width=\"70%\" height=\"200px\"}";
preg_match('/\{googleSimple\s*(.*?)\}/is', $indhold, $matches);

$params = process($matches);

print_r($params);

function process($matches)
{

    if (preg_match("/width=\"(\d+[\S]*)\"/", $matches[1], $matches2)) $width = $matches2[1];
    if (preg_match("/height=\"(\d+[\S]*)\"/", $matches[1], $matches2)) $height = $matches2[1];
   
    $param_google = new stdClass;
    $param_google->width = $width;
    $param_google->height = $height;

    return $param_google;
}
?>
Avatar billede jansangill Nybegynder
19. maj 2009 - 11:05 #4
Mange tak for hjælpen. Lige det der skulle til.

Kan du forklarede de forskellige tegn du har brugt i det?

Smid et svar.
Avatar billede acore Ekspert
19. maj 2009 - 19:46 #5
Jeg skal prøve:

/width=\"(\d+[\S]*)\"/

forklares som følger:

/ markerer at nu begynder vi
width= matcher "width="
\" matcher " - \ er nødvendig fordi eller "misforstås" anførselstegnet
( markerer at nu begynder der noget vi vil "samle op" som argument
\d+ matcher 1 eller flere cifre (tallet)
[\S]* matcher 0 eller flere tegn
) markerer at nu slutter "opsamlingen" til argumentet
\" matcher "
/ markerer at nu slutter vi

That's it. Der findes mange udmærkede tutorials på nettet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester