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 будет всегда отключен.
Спасибо,
Ответы
Ответ 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.'-','-'))