Как получить все за определенного персонажа?


150

У меня есть строка, и я хотел бы получить все после определенного значения. Строка всегда начинается с набора цифр, а затем подчеркивания. Я хотел бы получить оставшуюся часть строки после символа подчеркивания. Так, например, если у меня есть следующие строки и то, что я хотел бы вернуть:

"123_String" -> "String"
"233718_This_is_a_string" -> "This_is_a_string"
"83_Another Example" -> "Another Example"

Как я могу сделать что-то подобное?

Ответы:


348

Метод strpos()находит смещение символа подчеркивания, затем substr берет все, начиная с этого индекса плюс 1.

$data = "123_String";    
$whatIWant = substr($data, strpos($data, "_") + 1);    
echo $whatIWant;

Если вы также хотите проверить, _существует ли в вашей строке символ подчеркивания ( ), прежде чем пытаться его получить, вы можете использовать следующее:

if (($pos = strpos($data, "_")) !== FALSE) { 
    $whatIWant = substr($data, $pos+1); 
}

2
Что было бы лучше всего, чтобы проверить, существует ли подчеркивание, например, его необязательно.
Джон Магнолия

2
@JohnMagnolia: Тогда вы можете просто использоватьif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Амаль Мурали

11
@JohnMagnolia Или немного фантазии один вкладыш: substr($data, (strrpos($data, '_') ?: -1) +1).
грипп

2
@flu Думаю, ты хотел сказать, труднее читать. ИМО, меньше строк не значит красивее.
MH

Эта функция вернет строку после некоторой подстроки / символа или false, если игла не найдена:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor 02

16

strtok- это упущенная из виду функция для такого рода вещей. Это должно быть довольно быстро.

$s = '233718_This_is_a_string';
$firstPart = strtok( $s, '_' );
$allTheRest = strtok( '' ); 

Такая пустая строка приведет к возврату остальной части строки.

NB, если после '_' ничего не было, вы бы получили FALSEзначение, $allTheRestкоторое, как указано в документации , должно быть проверено с помощью ===, чтобы отличить его от других ложных значений.


3
Будьте осторожны: strtok вернет часть строки после символа, если это первый символ в строке, например, strtok('a_b', '_')вернет, aно strtok('_b', '_')вернет b, а не пустую строку, как вы ожидали
Куинн Комендант

10

Вот метод с использованием explode:

$text = explode('_', '233718_This_is_a_string', 2)[1]; // Returns This_is_a_string

или:

$text = @end((explode('_', '233718_This_is_a_string', 2)));

При указании 2для limitпараметра explode(), он возвращает массив с 2 -х максимальными элементами , разделенных разделителем строки. Возвращение 2-го элемента ( [1]) даст остальную часть строки.


Вот еще один однострочник с использованием strpos(как предлагает @flu ):

$needle = '233718_This_is_a_string';
$text = substr($needle, (strpos($needle, '_') ?: -1) + 1); // Returns This_is_a_string

2

если кому-то нужно извлечь первую часть строки, попробуйте,

Запрос:

$s = "This_is_a_string_233718";

$text = $s."_".substr($s, 0, strrpos($s, "_"));

Выход:

This_is_a_string



1
$string = "233718_This_is_a_string";
$withCharacter = strstr($string, '_'); // "_This_is_a_string"
echo substr($withCharacter, 1); // "This_is_a_string"

В одном заявлении было бы.

echo substr(strstr("233718_This_is_a_string", '_'), 1); // "This_is_a_string"

0

Я использую strrchr (). Например, чтобы найти расширение файла, я использую эту функцию:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.