PHP substr после определенного char, substr + strpos элегантное решение? - PullRequest
15 голосов
/ 27 октября 2010

скажем, я хочу вернуть все символы после некоторого символа иглы '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-й символ будет всегда обрезан.

Спасибо,

Ответы [ 5 ]

11 голосов
/ 27 октября 2010

С первым подходом все в порядке: проверьте, содержится ли x с strpos, и если да, получите что-нибудь после него с substr.

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

strstr($str, 'x')

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

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

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

4 голосов
/ 28 октября 2010

регулярные выражения сделали бы это намного более элегантным:

// 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);
0 голосов
/ 07 января 2015

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

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

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

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

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

0 голосов
/ 25 августа 2014

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

substr($item,0,strpos($item.'-','-'))
0 голосов
/ 27 октября 2010
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);
...