Натхненний коментарем @MitMaro, я написав невеликий орієнтир, щоб перевірити швидкість рішень @Gumbo, @Matt Bridges та @justin щодо пропозиції у питанні:
function teststrtok($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$str = strtok($str,'?');
}
}
function testexplode($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$str = explode('?', $str);
}
}
function testregexp($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
preg_replace('/\\?.*/', '', $str);
}
}
function teststrpos($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$qPos = strpos($str, "?");
$url_without_query_string = substr($str, 0, $qPos);
}
}
$number_of_runs = 10;
for($runs = 0; $runs < $number_of_runs; $runs++){
$number_of_tests = 40000;
$functions = array("strtok", "explode", "regexp", "strpos");
foreach($functions as $func){
$starttime = microtime(true);
call_user_func("test".$func, $number_of_tests);
echo $func.": ". sprintf("%0.2f",microtime(true) - $starttime).";";
}
echo "<br />";
}
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
strtok: 0,12; вибух: 0,19; регулярний вираз: 0,31; strpos: 0,18;
Результат: @ justin's strtok - найшвидший.
Примітка: протестовано на локальній системі Debian Lenny з Apache2 та PHP5.