Làm thế nào để có được mọi thứ sau một nhân vật nhất định?


140

Tôi đã có một chuỗi và tôi muốn có được mọi thứ sau một giá trị nhất định. Chuỗi luôn bắt đầu với một bộ số và sau đó là dấu gạch dưới. Tôi muốn có được phần còn lại của chuỗi sau dấu gạch dưới. Vì vậy, ví dụ nếu tôi có các chuỗi sau và những gì tôi muốn trả về:

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

Làm thế nào tôi có thể đi làm một cái gì đó như thế này?

Câu trả lời:


333

Việc strpos()tìm thấy phần bù của dấu gạch dưới, sau đó lớp nền lấy mọi thứ từ chỉ số đó cộng với 1 trở đi.

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

Nếu bạn cũng muốn kiểm tra xem ký tự gạch dưới ( _) có tồn tại trong chuỗi của bạn hay không trước khi thử lấy nó, bạn có thể sử dụng như sau:

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

2
Điều gì sẽ là tốt nhất để kiểm tra nếu gạch dưới tồn tại, ví dụ như tùy chọn của nó.
John Magnolia

2
@JohnMagnolia: Sau đó, bạn chỉ có thể sử dụngif (($pos = strpos($data, "_")) !== FALSE) { $whatIWant = substr($data, $pos+1); }
Amal Murali

11
@JohnMagnolia Hoặc một ít đồ lót lạ mắt : substr($data, (strrpos($data, '_') ?: -1) +1).
cúm

2
@flu Tôi nghĩ bạn muốn nói, khó đọc hơn. IMO, ít dòng hơn không có nghĩa là fancier.
MH

Hàm này sẽ trả về chuỗi sau một số chuỗi con / char hoặc false nếu không tìm thấy kim:function StrAfterStr($S, $H) { return (($P = strpos($S, $H)) !== false) ? substr($S, $P + 1) : false; }
Marcodor

14

strtoklà một chức năng bị bỏ qua cho loại điều này. Nó có nghĩa là khá nhanh.

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

Chuỗi rỗng như thế này sẽ buộc phần còn lại của chuỗi được trả về.

NB nếu không có gì cả sau '_', bạn sẽ nhận được một FALSEgiá trị $allTheRest, như đã nêu trong tài liệu , phải được kiểm tra với ===, để phân biệt với các giá trị giả mạo khác.


3
Hãy cẩn thận: strtok sẽ trả lại phần của chuỗi sau ký tự nếu đó là ký tự đầu tiên trong chuỗi, ví dụ: strtok('a_b', '_')sẽ trả về anhưng strtok('_b', '_')sẽ trả về b, không phải là một chuỗi trống như bạn mong đợi
Quinn Comendant

9

Đây là phương pháp bằng cách sử dụng explode:

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

hoặc là:

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

Bằng cách xác định 2cho các limittham số trong explode(), nó sẽ trả về mảng với 2 yếu tố tối đa phân cách bằng dấu phân cách chuỗi. Trả về phần tử thứ 2 ( [1]), sẽ cho phần còn lại của chuỗi.


Đây là một lớp lót khác bằng cách sử dụng strpos(như được đề xuất bởi @flu ):

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

2

nếu ai cần giải nén phần đầu tiên của chuỗi thì có thể thử,

Truy vấn:

$s = "This_is_a_string_233718";

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

Đầu ra:

This_is_a_opes


2

Một cách đơn giản khác, sử dụng strchr () hoặc 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"

Trong một tuyên bố duy nhất nó sẽ được.

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

0

Tôi sử dụng strrchr (). Ví dụ để tìm phần mở rộng của tệp tôi sử dụng chức năng này:

$string = 'filename.jpg';
$extension = strrchr( $string, '.'); //returns ".jpg"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.