11. juli 2012 - 20:50Der 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.
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 />';
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 />';
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>'; }
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
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? ;-)
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!
- og hvad mysql har af standardindstillinger er i øvrigt rystende ligegyldigt. Man sætter jo også serveruret - og bunker af andre indstillinger
Synes godt om
Ny brugerNybegynder
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.