webForumDet fria alternativet
Logga in / Bli medlem

Plocka ut. Hittar inte svaret.

PHP

9 svar · 231 visningar · startad av mikaeled

Medlem sedan dec. 2000157 inlägg
Frågan#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]

Medlem 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);
Medlem 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

Medlem sedan dec. 19995 874 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 :)

Medlem 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

Medlem 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...

Medlem sedan dec. 19995 874 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 :)

Medlem 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);
Medlem sedan dec. 19995 874 inlägg
#9

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

Medlem 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).

253 ms totalt · 4 externa anrop · v20260731065814-full.14655e19
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)