Як отримати все після певного персонажа?


140

У мене є рядок, і я хотів би отримати все після певного значення. Рядок завжди починається з набору чисел, а потім - підкреслення. Я хотів би отримати решту рядка після підкреслення. Наприклад, якщо у мене є такі рядки і що я хотів би повернути:

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

Як я можу робити щось подібне?

Відповіді:


333

В strpos()знахідки зміщення підкреслення, то зіЬзЬгі захоплює все від цього індексу плюс 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); }
Amal Murali

11
@JohnMagnolia Або трохи фантазії один вкладиш: substr($data, (strrpos($data, '_') ?: -1) +1).
грип

2
@flu Я думаю, ти мав на увазі сказати, важче читати. ІМО, менше ліній не означає більш фантазійних.
MH

Ця функція поверне рядок після деякої підрядки / char або false, якщо голка не знайдена:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor

14

strtok- це непомітна функція для подібних речей. Мається на увазі досить швидко.

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

Порожній рядок, подібний до цього, змусить повернути решту рядка.

Зверніть увагу: якщо після '_' взагалі нічого не було, ви отримаєте FALSEзначення, для $allTheRestякого, як зазначено в документації , слід перевірити значення ===, щоб відрізнити від інших фальшивих значень.


3
Будьте уважні: strtok поверне частину рядка після символу, якщо це перший символ у рядку, наприклад, strtok('a_b', '_')повернеться, aале strtok('_b', '_')повернеться b, а не порожній рядок, як ви очікували
Quinn Comendant

9

Ось метод за допомогою 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


2

Ще один простий спосіб, використовуючи strchr () або strstr () :

$str = '233718_This_is_a_string';

echo ltrim(strstr($str, '_'), '_'); // 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.