21. april 2007 - 13:39
Der er
23 kommentarer og 1 løsning
PHP: betingelse
Jeg har denne lille tildeling: $_POST['subject'] = "Re: ".$row['subject']; Det skal bruges til et postsystem, hvor der skal klistres "Re: " på ved besvarelser. Mit lille problem er, at det jeg egentligt er følgende: if ($row['subject'] IKKE starter med "Re: ") { $_POST['subject'] = "Re: ".$row['subject']; } Hvordan kan jeg klare den?
Annonceindlæg fra Infor
21. april 2007 - 13:41
#1
if (!preg_match("/^Re:/",$row['subject']) { $_POST['subject'] = "Re: ".$row['subject']; }
21. april 2007 - 13:52
#2
Jeg takker! Smider du lige et svar?
21. april 2007 - 15:39
#3
Jeg samler slet ikke på point, tak.
21. april 2007 - 17:01
#4
Ellers kan du bruge nedenstående. Den løser også dit "problem" og er teoretisk set hurtigere end at skulle bruge regular expressions (som i det forslag ericjacobsen skriver). if(substr($row['subject'], 0, 3) == "Re:")
22. april 2007 - 14:57
#5
Nu vi snakker hurtighed, så vil jeg mene dette er endnu hurtigere: if(strpos($row['subject'],'Re:') == 0)
22. april 2007 - 15:00
#6
strpos skal gennemsøge hele strengen, det skal substr ikke
22. april 2007 - 15:25
#7
Morhan: Returns the numeric position of the first occurrence of needle in the haystack string.
22. april 2007 - 15:32
#8
i værste tilfælde, skal den søge hele strengen igennem
22. april 2007 - 15:48
#9
en lille benchmark siger, at strpos er en anelse hurtigere, hvis subject er en lille tekst (som et subject normalt er) ved større tekst, er strpos en del langsommere, også selv om re: er tilstede
22. april 2007 - 15:55
#10
22. april 2007 - 16:28
#11
<?php function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $count = 100000; $str = "this is a subject"; for($langstr="", $i=0; $i<130; $i++) $langstr .= $str; //$str = $langstr; // kort eller lang streng $str2 = "Re: $str"; $start1 = microtime_float(); for($i=0; $i<$count; $i++){ if(substr($str, 0, 3) == 'Re :'); } $slut1= microtime_float(); $start2 = microtime_float(); for($i=0; $i<$count; $i++){ if(substr($str2, 0, 3) == 'Re :'); } $slut2= microtime_float(); $start3 = microtime_float(); for($i=0; $i<$count; $i++){ if(strpos($str, 'Re :') === 0); } $slut3= microtime_float(); $start4 = microtime_float(); for($i=0; $i<$count; $i++){ if(strpos($str2, 'Re :') === 0); } $slut4= microtime_float(); echo "<pre>"; echo "substr uden re: ".($slut1-$start1)."\n"; echo "substr med re: ".($slut2-$start2)."\n"; echo "strpos uden re: ".($slut3-$start3)."\n"; echo "strpos med re: ".($slut4-$start4)."\n"; echo "</pre>"; ?> kort str: substr uden re: 0.261208057404 substr med re: 0.223273038864 strpos uden re: 0.197156190872 strpos med re: 0.204102993011 lang str: substr uden re: 0.251914978027 substr med re: 0.237639904022 strpos uden re: 0.192348957062 strpos med re: 0.296867847443
22. april 2007 - 16:29
#12
det var forkert copy/pasted den lange streng: substr uden re: 0.247492790222 substr med re: 0.247993946075 strpos uden re: 0.606462955475 strpos med re: 0.62971496582
22. april 2007 - 16:39
#13
Ja, så begynder er at være stor forskel kan jeg godt se.
23. april 2007 - 09:09
#14
Godt. Dvs. at istedet for at bruge den RegExp, som erikjacobsen gav i 1. kommentar, så bør jeg istedet bruge: if(substr($row['subject'], 0, 3) == "Re:") ?
23. april 2007 - 09:15
#15
Når Re: er i starten, kan du bruge strpos(). Men er der tale om en længere streng, hvis Re: ikke er i starten, så skal du bruge substr().
25. april 2007 - 12:48
#16
jakobdo >> Smider du lige et svar?
25. april 2007 - 13:05
#17
Svar!
25. april 2007 - 13:16
#18
Takker for point.
25. april 2007 - 14:15
#19
Tak for hjælpen ;)
25. april 2007 - 18:38
#20
Jeg kan se, at det vi har fået lavet ikke virker :( Jeg har denne kode, som ikke virker: <? $subject="test"; echo "Start subject: ".$subject."<br>"; if(!strpos($subject,'Re:') == 0) { $subject = "Re: ".$subject; } echo "End subject: ".$subject; ?> Håber der er en, som kan hjælpe? :)
25. april 2007 - 18:47
#21
substr returnerer også false (ikke -1, som man er vant til fra andre spog), hvis søgestrengen ikke findes. Så du skal bruge === når du sammenligner med 0
25. april 2007 - 18:50
#22
Jeg synes ikke det bliver bedre af at lave dette: <? $subject="test"; echo "Start subject: ".$subject."<br>"; if(!strpos($subject,'Re:') === 0) { $subject = "Re: ".$subject; } echo "End subject: ".$subject; ?>
25. april 2007 - 18:53
#23
! har højere prioritet end === if(!(strpos($subject,'Re:') === 0)) { eller if(strpos($subject,'Re:') !== 0) {
25. april 2007 - 19:33
#24
Jeg siger mange tak :)
Vi tilbyder markedets bedste kurser inden for webudvikling