webForumDet fria alternativet

Plocka ut. Hittar inte svaret.

9 svar · 229 visningar · startad av mikaeled

mikaeledMedlem sedan dec. 2000157 inlägg
#1

Hej,

Har letat länge efter att hitta koden hur man gör detta.

Jag har en variabl som innehåller följande text:

(advertiser $0.30)
(advertiser $3.20)
(advertiser $1.66)

med följande kod;

eregi("advertiser(.*))", $file, $out);

så tar den ut allting efter första advertiser och sista ) så att det ser ut såhär:

$0.30)
(advertiser $3.20)
(advertiser $1.66

men jag vill ta ut varje så det blir:

$out[1] = $0.30
$out[2] = $3.20
$out[3] = $1.66

dvs att den tar ut för första och sedan andra ) etc...

hur gör man? jag tror att man ska ändra .* till ngt annat, vet dock inte hur.

Mikael

[Redigerat av mikaeled den 09 dec 2001]

[Redigerat av mikaeled den 09 dec 2001]

2basMedlem sedan juni 2001181 inlägg
#2

Jag är så jäkla dålig på regexps så, jag skulle gjort något sånt här istället:

$str="(advertiser $0.30)
(advertiser $3.20)
(advertiser $1.66)";

$str=str_replace(')','',$str);
$out=explode('(advertiser ',$str);

------------------
Gratis hemsideadress och email => http://www.has.it

mikaeledMedlem sedan dec. 2000157 inlägg
#3

jag kan inte göra så, tyvärr. men någon här måste ju veta hur man gör.

Mikael

BrimbaMedlem sedan dec. 19995 875 inlägg
#4

Vill du ha det så, så bör den riktiga pattern se ut såhär:

"\(advertiser\ (.*)\)"

alltså:

eregi("\(advertiser\ (.*)\)", $file, $out);

Nu har jag inte hållt på med PHP någonting så jag vet inte. Men generellt sätt så bör ju regular expressions fungera på samma sätt.
Du kan ju prova i alla fall :)

------------------
Mvh
Patrik aka Brimba

[Redigerat av Brimba den 10 dec 2001]

mikaeledMedlem sedan dec. 2000157 inlägg
#5

spelar ingen roll mot min översta koden.
resultatet blir exakt samma dvs att den tar all efter första advertiser och sista ) men jag vill ha efter varje advertiser och efter varje )
Mikael

2basMedlem sedan juni 2001181 inlägg
#6

fattar inte riktigt vad du skall göra, då mitt förra förslag inte funkade. Men om du absolut vill använda regexps så kan följande göra vad du vill.

$str="(advertiser $0.30) (advertiser $3.20) (advertiser $1.66)";

$str=ereg_replace("[\(\)a-zA-Z]","", $str);
$out=explode("  ",$str);

Men detta funkar inte om dina advertiser är typ advertiser1, advertiser2...

------------------
Gratis hemsideadress och email => http://www.has.it

BrimbaMedlem sedan dec. 19995 875 inlägg
#7

såhär kanske?

$file = "(advertiser $0.30)(advertiser $3.20)(advertiser $1.66)";
$ptrn = "\(advertiser\ ([^\)]*)\)";
$out = eregi_replace($ptrn, "\\1<br>", $file);
$outarr = explode("<br>", $out);
echo $outarr[0]."<br>";
echo $outarr[1]."<br>";
echo $outarr[2]."<br>";

r/ explode fanns visst. Tack föregående talare :)

------------------
Mvh
Patrik aka Brimba

[Redigerat av Brimba den 10 dec 2001]

spangoMedlem sedan juni 20008 205 inlägg
#8

Kleenestjärnan (alltså *) är "greedy", dvs den försöker matcha så mycket som den kan utan att regexpen misslyckas, och eftersom "." betyder "allt som inte är radbrytning" så käkar den glatt upp parantesen. För att göra stjärnan ickegirig använder man frågetecken efter:

eregi('advertiser (.*?)\)', $file, $out);

------------------
You can be a coward for a few minutes, or dead forever. /Rincewind

[Redigerat av spango den 10 dec 2001]

BrimbaMedlem sedan dec. 19995 875 inlägg
#9

spango, jag är mycket tveksam till att det där fungerar.

------------------
Mvh
Patrik aka Brimba

spangoMedlem sedan juni 20008 205 inlägg
#10

Klart det inte gör ;)
preg_match_all är bäst i det här fallet, skulle jag vilja påstå:

preg_match_all('/\(advertiser (.*?)\)/', $sträng_att_matcha, $matches);
$numbers = $matches[1];

Om $sträng_att_matcha innehöll texten i det första inlägget här i tråden, så skulle $numbers efteråt vara array('$0.30', '$3.20', '$1.66'). Man skulle iofs kunna göra det lite fräckare:

preg_match_all('/\(advertiser \$(\d+(\.\d+)?)\)/', $sträng_att_matcha, $matches);
$numbers = $matches[1];

Nu skulle $numbers vara en array av numeriska värden, flyt- eller heltal (eller egentligen strängar som går att använda som flyt- och heltal).

------------------
You can be a coward for a few minutes, or dead forever. /Rincewind

[Redigerat av spango den 10 dec 2001]

128 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)