webForumDet fria alternativet

Mera preg_match

3 svar · 412 visningar · startad av drew

drewMedlem sedan mars 2007845 inlägg
#1

Jag har

<contributions status="past" from="2006-01-01" to="2008-01-11" position="Developer"/>

Och försöker hitta innehållet i status med

preg_match('|status="(.*)"|', $data, $out);

Svaret blir

past" from="2006-01-01" to="2008-01-11" position="Developer

Tanken är att det ska sluta letas vid första " efter status=" så svaret ska bli

past

Jag skulle ju kunna använda strtok eller liknande för att slänga det som är efter första " i svaret, men det måste ju gå att få in i preg_match.

Hur?

/drew

Peter SMedlem sedan dec. 20025 483 inlägg
#2
preg_match('|status="([^"]*)"|', $data, $out);
drewMedlem sedan mars 2007845 inlägg
#3

Funkade perfekt, tack. Har du lust att förklara?

Enligt "Regex in a nutshell" så betyder det "any character not listed". Jag trodde den skulle ge samma resultat så utom att den tagit bort ".

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Båda mönstrena är greedy, vilket innebär att de försöker matcha så många tecken som möjligt innan ". Med andra ord matchar ditt mönster alla tecken innan det sista " i strängen. En annan lösning hade varit att ändra ditt mönster till att vara non-greedy, d.v.s. matcha så få tecken som möjligt innan ". Detta görs genom att sätta ett ? efter *.

Mitt mönster säger: matcha noll eller flera tecken som inte är ". Tecknena skall sedan följas av ett ".

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