Avatar billede dennism Nybegynder
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?
Avatar billede erikjacobsen Ekspert
21. april 2007 - 13:41 #1
if (!preg_match("/^Re:/",$row['subject']) {
  $_POST['subject'] = "Re: ".$row['subject'];
}
Avatar billede dennism Nybegynder
21. april 2007 - 13:52 #2
Jeg takker! Smider du lige et svar?
Avatar billede erikjacobsen Ekspert
21. april 2007 - 15:39 #3
Jeg samler slet ikke på point, tak.
Avatar billede razmuz_dk Nybegynder
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:")
Avatar billede jakobdo Ekspert
22. april 2007 - 14:57 #5
Nu vi snakker hurtighed, så vil jeg mene dette er endnu hurtigere:

if(strpos($row['subject'],'Re:') == 0)
Avatar billede morhan Novice
22. april 2007 - 15:00 #6
strpos skal gennemsøge hele strengen, det skal substr ikke
Avatar billede jakobdo Ekspert
22. april 2007 - 15:25 #7
Morhan: Returns the numeric position of the first occurrence of needle in the haystack string.
Avatar billede morhan Novice
22. april 2007 - 15:32 #8
i værste tilfælde, skal den søge hele strengen igennem
Avatar billede morhan Novice
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
Avatar billede jakobdo Ekspert
22. april 2007 - 15:55 #10
Jeg laver samme test med 100000 forsøg!
Resultatet kan ses her:
http://www.codebreaker.dk/exp/774488aexp.php
http://www.codebreaker.dk/exp/774488bexp.php
Avatar billede morhan Novice
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
Avatar billede morhan Novice
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
Avatar billede jakobdo Ekspert
22. april 2007 - 16:39 #13
Ja, så begynder er at være stor forskel kan jeg godt se.
Avatar billede dennism Nybegynder
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:")

?
Avatar billede jakobdo Ekspert
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().
Avatar billede dennism Nybegynder
25. april 2007 - 12:48 #16
jakobdo >>

Smider du lige et svar?
Avatar billede jakobdo Ekspert
25. april 2007 - 13:05 #17
Svar!
Avatar billede jakobdo Ekspert
25. april 2007 - 13:16 #18
Takker for point.
Avatar billede dennism Nybegynder
25. april 2007 - 14:15 #19
Tak for hjælpen ;)
Avatar billede dennism Nybegynder
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? :)
Avatar billede morhan Novice
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
Avatar billede dennism Nybegynder
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;
?>
Avatar billede morhan Novice
25. april 2007 - 18:53 #23
! har højere prioritet end ===

if(!(strpos($subject,'Re:') === 0)) {

eller

if(strpos($subject,'Re:') !== 0) {
Avatar billede dennism Nybegynder
25. april 2007 - 19:33 #24
Jeg siger mange tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester