0

写这个的最短方法是什么?

if(strpos($haystack, $needle)!==false){
    $len = strpos($haystack, $needle)+strlen($needle);
}else{
    $len = 0;
}

我记得我在某处看到了一些快捷方式,它同时检查并设置了一个变量。

4

6 回答 6

5
$len = 0;
if(($pos = strpos($haystack, $needle)) !== false) {
    $len = $pos + strlen($needle);
}

我建议不要使用三元?:运算符,即使它更短。

于 2010-04-12T11:27:42.127 回答
2
$len = strpos($haystack, $needle);
$len = ($len !== false) ? $len + strlen($needle) : 0;
于 2010-04-12T11:28:31.047 回答
1
$len=strpos($haystack, $needle);
if($len !== FALSE) {
    $len +=  strlen($needle);
}

而且,在我看来,三元运算符对可读性的影响是可怕的。

于 2010-04-12T11:27:25.573 回答
0

它被称为三元运算符,可以这样使用:

$len = strpos($haystack, $needle) ? strpos($haystack, $needle)+strlen($needle) : 0;

但是,您应该小心使用它,因为它会使某些表达式很难阅读。

于 2010-04-12T11:25:49.447 回答
0
$len = strpos($haystack, $needle) ? strpos($haystack, $needle)+strlen($needle) : 0;

另请参阅三元运算

于 2010-04-12T11:26:00.897 回答
0

另一种方法:

$len = strlen(preg_replace('/(.*?'.preg_quote($needle,'/').')?.*/', '$1', $haystack));

可能更慢且更占用内存,但它确实需要更少的输入。所以它是否真的是一个捷径取决于定义。如果您对三元运算符和评估条件下的赋值过敏,它确实提供了一个有效的选项。

你也可以做

$len = preg_match('/'.preg_quote($needle,'/').'()/', $haystack, $m, PREG_OFFSET_CAPTURE)? $m[1][1] : 0

尽管再次使用 preg_ 函数搜索固定字符串有点浪费资源。

于 2010-04-12T12:38:13.910 回答