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);
9 svar · 231 visningar · startad av mikaeled
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]
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);
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
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
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...
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
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);
spango, jag är mycket tveksam till att det där fungerar.
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).