/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Regex
Fra : Kasper Johansen


Dato : 07-12-03 12:32

Hej gruppe.

Jeg har et kæmpe textfelt som flere steder indeholder linjer som skal laves
om til dynamisk indhold.

Et eksempel på et stykke der skulle laves om ville være:

[replay: 42]

42 er et id til en database som også indeholder en titel. Jeg vil så have
hele dette stykke tekst erstattet af denne titel. Til dette har jeg en
funktion der finder titlen og returnere denne ved at give den nummeret. Jeg
er ikke så god til regex endnu men jeg er kommet frem til dette:

$in_indhold = preg_replace("/\[(Replay|replay)+(:|: )+(\d+)\]/",
GetTitle($3), $in_indhold);

Men den giver en fejl, sansynligvis pga. $3. Er der nogle der kan give en
forklaring på hvad jeg gør forkert?

Med venlig hilsen
Kasper Johansen



 
 
Kasper Garnæs (07-12-2003)
Kommentar
Fra : Kasper Garnæs


Dato : 07-12-03 12:49

Kasper Johansen <kasper@llsweb.dk> wrote:

> Et eksempel på et stykke der skulle laves om ville være:
>
> [replay: 42]
>
> $in_indhold = preg_replace("/\[(Replay|replay)+(:|: )+(\d+)\]/",
> GetTitle($3), $in_indhold);
>
> Men den giver en fejl, sansynligvis pga. $3. Er der nogle der kan
> give en forklaring på hvad jeg gør forkert?

Det ville i første hånd være rart at vide, hvad fejlen var. Det er jo ikke
til at se, om den ligger inden i eller uden for dit regulære udtryk.

Umiddelbart så ser det dog ud til, at følgende virker på dit eksempel:

$text = preg_replace("/\[replay:\s?\d+\]/", $title, $text);

--
Med venlig hilsen / Regards
Kasper Garnæs
http://kasper.garnaes.dk



Kasper Johansen (07-12-2003)
Kommentar
Fra : Kasper Johansen


Dato : 07-12-03 13:25

> $text = preg_replace("/\[replay:\s?\d+\]/", $title, $text);

Problemet ligger i at jeg ikke kan få den til at erstatte det. Jeg er ikke
sikker på hvori problemet ligger. Men problemet består i at jeg vil have den
til at erstatte noget tekst inde med noget fra en database, alt efter hvad
id der er en del af det stykke tekst som skal erstattes.

Hvis vi tager udgangspunkt i dit eksempel:

$text = preg_replace("/\[replay:\s?\d+\]/", $title, $text);

I dette skal jeg altså bruge nummere som kommer efter [replay: nr]. Dette nr
er jo som sagt id til noget i en database. Dertil ville jeg så bruge en
funktion til at returnere denne titel ved hjælp at mit id.

Håber ikke det var alt for kludret...



Kasper Garnæs (07-12-2003)
Kommentar
Fra : Kasper Garnæs


Dato : 07-12-03 13:50

Kasper Johansen <kasper@llsweb.dk> wrote:
> Hvis vi tager udgangspunkt i dit eksempel:
>
> $text = preg_replace("/\[replay:\s?\d+\]/", $title, $text);
>
> I dette skal jeg altså bruge nummere som kommer efter [replay: nr].
> Dette nr er jo som sagt id til noget i en database. Dertil ville jeg
> så bruge en funktion til at returnere denne titel ved hjælp at mit id.

Ah - det havde jeg overset. Så tror jeg, du er nødt til at parse udtrykket
flere gange. Først for at finde de de udtryk, der skal erstattes og de
id'er, du skal bruge, og derefter for at erstatte udtrykkene med tilsvarende
titler hentet fra databasen.

Det kunne være noget ligende:

if (preg_match_all("/\[replay:\s?(\d+)\]/i", $text, $matches)) {
$toBeReplaced = $matches[0];
$ids = $matches[1];
foreach($ids as $key => $id) {
$title = GetTitle($id);
$text = str_replace($toBeReplaced[$key], $title, $text);
}
}

--
Med venlig hilsen / Regards
Kasper Garnæs
http://kasper.garnaes.dk



Peter Brodersen (08-12-2003)
Kommentar
Fra : Peter Brodersen


Dato : 08-12-03 08:02

On Sun, 7 Dec 2003 12:31:52 +0100, "Kasper Johansen"
<kasper@llsweb.dk> wrote:

>Men den giver en fejl, sansynligvis pga. $3. Er der nogle der kan give en
>forklaring på hvad jeg gør forkert?

Du skal have evalueret dit udtryk on-the-fly. Det kræver e-optionen,
og andet argument skal, ligesom med eval(), være en string, der altså
indeholder PHP-kode.

Et eksempel på brug af e-option'en:

<?php
$text = "vi har her en lille sætning med nogle ord i";
print preg_replace('/\b([a-zæøå]{3})\b/e','ucfirst("$1")',$text);
?>

Her finder vi tekststykker på tre bogstaver, og som eksempel kaster
det fundne igennem PHP-funktionen ucfirst. Resultatet bliver:
vi Har Her en lille sætning Med nogle Ord i

Dit eksempel:

>$in_indhold = preg_replace("/\[(Replay|replay)+(:|: )+(\d+)\]/",
>GetTitle($3), $in_indhold);

... skal så have e-option'en tilføjet, og have GetTitle-koden være en
del af string'en:

$in_indhold = preg_replace('/\[(Replay|replay)+(:|: )+(\d+)\]/e',
'GetTitle("$3")', $in_indhold);


Husk at din GetTitle-funktion skal return'e en string, og ikke print'e
den, men det går jeg ud fra er tilfældet i forvejen.

--
- Peter Brodersen

Ugens sprogtip: trafik (og ikke traffik)

Søg
Reklame
Statistik
Spørgsmål : 177502
Tips : 31968
Nyheder : 719565
Indlæg : 6408534
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste