Avatar billede laggal Nybegynder
11. juli 2012 - 20:50 Der er 10 kommentarer og
1 løsning

preg_replace

Hej, nu mangler jeg lidt hjælp fra eksperterne :D

Her er min kode:
[quote]<?php

$string = '<Hey, my name is John, and I am 25 years old.><Hey, my name is Alice, and I am 44 years old.>';

$replace = preg_replace('/(<Hey, my name is )([a-zA-Z]+)(, and I am )([0-9]+)( years old.>)/', '$2 - $4<br />', $string);

echo $replace;

?>[/quote]
Dette virker fint og den skriver hvad den skal:
[quote]
John - 25
Alice - 44
[/quote]

MEN hvis jeg ændrer mind string, og skriver noget før, i midten af eller efter de to <> virker det ikke.

Jeg vil finde <Hey, my name is John, and I am 25 years old.> ligemeget hvor det står i teksten(navn og alder kan ændres), og få den til at skrive det som jeg viste det før, ligemeget hvor mange gange teksten er fundet og om der står noget tilfældigt før eller efter teksten.

Jeg har prøvet noget i denne stil, men uden held:

[quote]<?php

$string = 'This is some text before, which should be cutted away<Hey, my name is John, and I am 25 years old.>This is some text in the middle, which should be cutted away<Hey, my name is Alice, and I am 44 years old.>This is some text after, which should be cutted away';

$replace = preg_replace('/(.*)(<Hey, my name is )([a-zA-Z]+)(, and I am )([0-9]+)( years old.>)(.*)/', '$3 - $5<br />', $string);

echo $replace;

?>[/quote]

Den skulle så gerne skrive det samme som før, men det gør den ikke:
[quote]
John - 25
Alice - 44
[/quote]

Jeg har også prøvet med preg_match, men så skriver den kun 1 resultat..

Jeg vil også gerne få den til at skrive hvor mange gange den har fundet min tekst.
Avatar billede Qobra Nybegynder
11. juli 2012 - 21:09 #1
Hvorfor har du tilføjet (.*) først og sidst? Det behøves ikke :)
Avatar billede Qobra Nybegynder
11. juli 2012 - 21:09 #2
Og det er formentlig derfor det ikke virker! For så bliver resten af strengen fanget i (.*)
Avatar billede Qobra Nybegynder
11. juli 2012 - 21:12 #3
Prøv noget i stil med:
foreach(preg_match_all('/(<Hey, my name is )([a-zA-Z]+)(, and I am )([0-9]+)( years old.>)/', $string) as $match) echo $match[2].' - '.$match[4].'<br />';
Avatar billede Qobra Nybegynder
11. juli 2012 - 21:16 #4
Skulle nok nærmere have været i den her stil :)
preg_match_all('/(<Hey, my name is )([a-zA-Z]+)(, and I am )([0-9]+)( years old.>)/', $string, $matches);
for($i=0;$i<count($matches[0]);++$i)
echo $match[2][$i].' - '.$match[4][$i].'<br />';
Avatar billede laggal Nybegynder
11. juli 2012 - 21:54 #5
tak skal du have! :)
Avatar billede olebole Juniormester
11. juli 2012 - 22:11 #6
<ole>

Der er ikke grund til mere nd to parenteser/backreferences - og så duer løsningen vist ikke helt under vores himmelstrøg. Hvis løsningen skal understøtte Gurli-Margrethe, Øyvind og alle de herboende polakker, spaniere, svenskere og andre med sære specialtegn i navnet, kan den se sådan ud:

preg_match_all('/<Hey, my name is (\w+), and I am ([0-9]+) years old.>/u', $string, $matches);
for ($i=0,$j=count($matches[1]); $i<$j; $i++) {
    echo $matches[1][$i].' - '.$matches[2][$i].'<br>';
}

/mvh
</bole>
Avatar billede Qobra Nybegynder
11. juli 2012 - 22:44 #7
Tror desværre ikke Gurli-Magrethe bliver matchet i den der, og medmindre Øyvind er i UTF-8 bliver han nok heller ikke fanget ;-)
Avatar billede olebole Juniormester
11. juli 2012 - 22:55 #8
Korrekt, at bindestregen ikke bliver accepteret, samt at tegnsættet skal være utf-8. Det sidste kan vel ikke undre nogen. Der er næppe mange, der bruger iso-8859-1 eller andre de facto forældede tegnsæt
Avatar billede Qobra Nybegynder
11. juli 2012 - 23:40 #9
Eftersom libmysql som standard åbner en latin1 forbindelse, tror jeg der er pænt mange, der bruger et lignende tegnsæt i php. Og det passer jo meget godt, hvis man udvikler på windows, hvor standard tegnsættet ofte også er vesteuropæisk. Så helt ulogisk og forældet ville jeg nok ikke kalde det endnu. Men der er jo heller ingen, der bruger magic quotes længere, vel? ;-)
Avatar billede olebole Juniormester
12. juli 2012 - 00:26 #10
Vi andre bruger JavaScript/Ajax. Så hedder tegnsættet naturligvis utf-8, og eftersom stort set ingen omkring os længere bruger vesteuropæsike tegnsæt, og WWW går ud på international kommunikation, er det også på dette punkt tilrådeligt at følge med tiden.

Derudover er det også tilrådeligt at skille trådene lidt bedre ud fra hinanden. Det er ikke hensigtsmæssigt, du bliver ved med at vrøvle om magic_quotes. Det emne har vi i en anden tråd klart og tydeligt konstateret, vi ikke er enige om. Lad nu det ligge og koncentrer dig om emnet i denne tråd ... med mindre din dagsorden altså bare er tåbelige mundhuggerier!
Avatar billede olebole Juniormester
12. juli 2012 - 00:28 #11
- og hvad mysql har af standardindstillinger er i øvrigt rystende ligegyldigt. Man sætter jo også serveruret - og bunker af andre indstillinger
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