php: ярлык для написания этого? - PullRequest
0 голосов
/ 12 апреля 2010

Какой самый короткий способ написать это?

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

Я помню, что где-то видел ярлык, который проверял и одновременно устанавливал переменную.

Ответы [ 6 ]

5 голосов
/ 12 апреля 2010
$len = 0;
if(($pos = strpos($haystack, $needle)) !== false) {
    $len = $pos + strlen($needle);
}

Я бы рекомендовал против троичного оператора ?:, даже если он короче.

2 голосов
/ 12 апреля 2010
$len = strpos($haystack, $needle);
$len = ($len !== false) ? $len + strlen($needle) : 0;
1 голос
/ 12 апреля 2010
$len=strpos($haystack, $needle);
if($len !== FALSE) {
    $len +=  strlen($needle);
}

и, на мой взгляд, троичный оператор ужасно влияет на читабельность.

0 голосов
/ 12 апреля 2010

Другой подход:

$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_ для поиска фиксированных строк.

0 голосов
/ 12 апреля 2010
$len = strpos($haystack, $needle) ? strpos($haystack, $needle)+strlen($needle) : 0;

См. Также Тройная операция .

0 голосов
/ 12 апреля 2010

Он называется тенарным оператором и может использоваться следующим образом:

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

Вы должны использовать это с осторожностью, потому что это может сделать некоторые выражения довольно трудно читать.

...