Подтвердить что ты не робот

PHP substr после некоторого char, элементарного решения substr + strpos?

скажем, я хочу вернуть все символы после некоторой иглы char 'x' из:

$source_str = "Tuex helo babe".

Обычно я бы сделал это:

if( ($x_pos = strpos($source_str, 'x')) !== FALSE )
   $source_str = substr($source_str, $x_pos + 1);

Знаете ли вы лучше/умнее (более элегантный способ)?

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

К сожалению, мы не можем:

$source_str = substr(source_str, strpos(source_str, 'x') + 1);

Потому что, когда 'x' не найден, strpos возвращает FALSE (а не -1, как в JS). FALSE будет оцениваться до нуля, а 1-й char будет всегда отключен.

Спасибо,

4b9b3361

Ответ 1

Ваш первый подход в порядке: проверьте, содержится ли x с strpos, и если это так получилось после него с помощью substr.

Но вы также можете использовать strstr:

strstr($str, 'x')

Но поскольку это возвращает подстроку, начинающуюся с x, используйте substr, чтобы получить деталь после x:

if (($tmp = strstr($str, 'x')) !== false) {
    $str = substr($tmp, 1);
}

Но это намного сложнее. Поэтому используйте ваш подход strpos.

Ответ 2

Regexes сделает его намного более элегантным:

// helo babe
echo preg_replace('~.*?x~', '', $str);

// Tuex helo babe
echo preg_replace('~.*?y~', '', $str);

Но вы всегда можете попробовать следующее:

// helo babe
echo str_replace(substr($str, 0, strpos($str, 'x')) . 'x', '', $str);

// Tuex helo babe
echo str_replace(substr($str, 0, strpos($str, 'y')) . 'y', '', $str);

Ответ 3

if(strpos($source_str, 'x') !== FALSE )
   $source_str = strstr($source_str, 'x');

Менее элегантный, но без x в начале:

if(strpos($source_str, 'x') !== FALSE )
   $source_str = substr(strstr($source_str, 'x'),1);

Ответ 4

Мне нужно именно это, и стремление сохранить его на одной линии для удовольствия придумало следующее:

ltrim(strstr($source_str, $needle = "x") ?: $source_str, $needle);

ternary operator был адаптирован в 5.3, чтобы позволить этому работать.

С PHP 5.3 можно исключить среднюю часть тернарного оператора. Expression expr1?: Expr3 возвращает expr1, если expr1 имеет значение TRUE и expr3 в противном случае.

NB. ltrim обрезает несколько совпадающих символов в начале строки.

Ответ 5

Добавить '-' в конце $item, чтобы он всегда возвращал строку до '-' even $item не содержит '-', потому что strpos по умолчанию возвращает позицию первого появления '-',

substr($item,0,strpos($item.'-','-'))