Làm thế nào để loại bỏ một phần của một chuỗi? [đóng cửa]


152

Làm thế nào tôi có thể loại bỏ một phần của chuỗi?

Chuỗi ví dụ: "REGISTER 11223344 here"

Làm thế nào tôi có thể loại bỏ "11223344"khỏi chuỗi ví dụ trên?


Câu hỏi của bạn không rõ ràng / mơ hồ. Bạn đang sử dụng thuật ngữ này remove, nhưng có vẻ như bạn muốn nói extractrằng chuỗi mục tiêu có thể được lưu trữ trong cơ sở dữ liệu.
mickmackusa

@Makyen Tôi cảm thấy khá tự tin rằng bạn đã phá hoại câu hỏi để làm cho nhiều câu trả lời đúng. Hãy nghĩ về nó: tại sao OP muốn lưu REGISTER heretrong cơ sở dữ liệu?
mickmackusa

2
@mickmackusa loại bỏ có thể đồng nghĩa với lấy đi, tức là lấy 11223344 ra khỏi chuỗi, tôi không thấy vấn đề ở đây. Tệ nhất là nó mơ hồ, nó chắc chắn không "phá hoại"
Nick

Đọc (các) phiên bản tiền phá hoại. @Nick stackoverflow.com/posts/2192170/revutions Sự thật sẽ thay đổi suy nghĩ của bạn. Tôi sẽ rất vui khi thấy câu hỏi này được đóng lại là Không rõ ràng.
mickmackusa

2
@mickmackusa Tôi đã làm ... Tôi không thấy quan điểm của bạn. Nếu bạn gặp vấn đề lớn như vậy với cách viết như vậy tại sao không tự khắc phục
Nick

Câu trả lời:


220

Nếu bạn đặc biệt nhắm mục tiêu "11223344", thì hãy sử dụng str_replace:

// str_replace($search, $replace, $subject)
echo str_replace("11223344", "","REGISTER 11223344 here");


119

Bạn có thể sử dụng str numplace () , được định nghĩa là:

str_replace($search, $replace, $subject)

Vì vậy, bạn có thể viết mã dưới dạng:

$subject = 'REGISTER 11223344 here' ;
$search = '11223344' ;
$trimmed = str_replace($search, '', $subject) ;
echo $trimmed ;

Nếu bạn cần kết hợp tốt hơn thông qua các biểu thức thông thường, bạn có thể sử dụng preg numplace () .


2
Nếu ai đó cần kết hợp regex thì cũng có preg numplace
Elijah Lynn

4
Không chắc tại sao câu trả lời này được đăng, đó là một bản sao dài hơn của câu trả lời của Dominic và một bản sao ngắn hơn của câu trả lời của Roland ...
CPHPython

23

giả sử 11223344 không phải là hằng số

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";

8
str_replace(find, replace, string, count)
  • tìm Yêu cầu. Chỉ định giá trị cần tìm
  • Yêu cầu thay thế . Chỉ định giá trị để thay thế giá trị trong find
  • chuỗi yêu cầu. Chỉ định chuỗi cần tìm kiếm
  • đếm tùy chọn. Một biến số đếm số lần thay thế

Theo ví dụ OP:

$Example_string = "REGISTER 11223344 here";
$Example_string_PART_REMOVED = str_replace('11223344', '', $Example_string);

// will leave you with "REGISTER  here"

// finally - clean up potential double spaces, beginning spaces or end spaces that may have resulted from removing the unwanted string
$Example_string_COMPLETED = trim(str_replace('  ', ' ', $Example_string_PART_REMOVED));
// trim() will remove any potential leading and trailing spaces - the additional 'str_replace()' will remove any potential double spaces

// will leave you with "REGISTER here"

1
Làm thế nào để bạn đề xuất rằng OP sử dụng mã giả này?
mickmackusa

6

Khi bạn cần kết hợp dựa trên quy tắc, bạn cần sử dụng regex

$string = "REGISTER 11223344 here";
preg_match("/(\d+)/", $string, $match);
$number = $match[1];

Điều đó sẽ khớp với bộ số đầu tiên, vì vậy nếu bạn cần cụ thể hơn hãy thử:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];

preg numplace () sẽ dễ dàng hơn nhiều phải không? us2.php.net/manual/en/feft.preg-replace.php
Elijah Lynn

1
@ElijahLynn thay thế yêu cầu bạn xóa mọi thứ, những thay đổi trong tương lai hoặc tiếng ồn sẽ bị phá vỡ. Làm điều này thông qua _replace nhưng _match sẽ tiếp tục hoạt động.
TravisO

@TravisO cũng có, nhưng không. Hai cái đó gần như giống nhau khi thực hiện các chức năng và có khả năng những thay đổi trong tương lai ảnh hưởng đến bất kỳ trong số chúng là như nhau . Có khả năng thay đổi tương tự chỉ trong _match, khiến việc sử dụng này không hợp lệ và _replace vẫn hoạt động tốt. Ngoài ra, phiên bản thường rất quan sát để không hãm chức năng trước đó, nếu có thể.
CT.

Bạn không cần một nhóm chụp ở đây. Trong thực tế, sử dụng nhóm chụp không cần thiết làm mờ $matchmảng. Loại bỏ các dấu ngoặc sau đó acces qua $match[0].
mickmackusa

5

chất nền () là một hàm php tích hợp trả về một phần của chuỗi. Hàm struct () sẽ lấy một chuỗi làm đầu vào, dạng chỉ mục nơi bạn muốn chuỗi được cắt. và một tham số tùy chọn là độ dài của chuỗi con. Bạn có thể xem tài liệu và mã ví dụ thích hợp trên http://php.net/manual/en/feft.substr.php

LƯU Ý: chỉ mục cho một chuỗi bắt đầu bằng 0.


Làm thế nào để bạn đề xuất rằng OP nên sử dụng gợi ý chung của bạn để đạt được kết quả mong muốn?
mickmackusa

Tôi thấy câu trả lời này là mơ hồ và giá trị thấp.
mickmackusa

1

Tự động, nếu bạn muốn xóa (a) một phần khỏi (a) chỉ mục cố định (es) của một chuỗi, hãy sử dụng chức năng này:

/**
 * Removes index/indexes from a string, using a delimiter.
 * 
 * @param string $string
 * @param int|int[] $index An index, or a list of indexes to be removed from string.
 * @param string $delimiter 
 * @return string
 * @todo Note: For PHP versions lower than 7.0, remove scalar type hints (i.e. the
 * types before each argument) and the return type.
 */
function removeFromString(string $string, $index, string $delimiter = " "): string
{
    $stringParts = explode($delimiter, $string);

    // Remove indexes from string parts
    if (is_array($index)) {
        foreach ($index as $i) {
            unset($stringParts[(int)($i)]);
        }
    } else {
        unset($stringParts[(int)($index)]);
    }

    // Join all parts together and return it
    return implode($delimiter, $stringParts);
}

Vì mục đích của bạn:

remove_from_str("REGISTER 11223344 here", 1); // Output: REGISTER here

Một trong những cách sử dụng của nó là thực thi các chuỗi giống như lệnh mà bạn biết cấu trúc của chúng.


1
Ghostdog đã đề xuất một kỹ thuật nổ tung, nhưng tôi không thể tưởng tượng được việc giải trí một kỹ thuật kéo dài như vậy cho một hoạt động cơ bản như vậy.
mickmackusa

0

Đoạn mã sau sẽ in "ĐĂNG KÝ tại đây"

$string = "REGISTER 11223344 here";

$result = preg_replace(
   array('/(\d+)/'),
   array(''),
   $string
);

print_r($result);

API preg numplace () sử dụng chúng tôi như được đưa ra dưới đây.

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);

Hoàn toàn không có lý do để vượt qua các mảng preg_replace()trong trường hợp này. Cũng không có bất kỳ lợi ích để sử dụng một nhóm chụp.
mickmackusa

Tôi đồng ý. Mảng được thêm vào chỉ để thuận tiện. Nó có thể bị bỏ qua. Nó sẽ không làm hại. Đã thêm nhóm chụp để loại trừ số. Điều này đang làm việc theo câu hỏi âm mưu. Và sửa đổi thêm và tinh chỉnh có thể được thực hiện dựa trên các cá nhân.
arango_86

Quan điểm của tôi là, có những vùi không cần thiết trong đoạn trích của bạn mà không có ý nghĩa gì để đưa vào.
mickmackusa

-1

Làm như sau

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER(.*)here/','',$string);

Điều này sẽ trả về "ĐĂNG KÝ"

hoặc là

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER (.*) here/','',$string);

Điều này sẽ trả về "ĐĂNG KÝ tại đây"


4
Nó sẽ không trả về "REGISTER__here", với hai khoảng trống (nghĩ rằng gạch dưới là khoảng trắng, nhận xét sẽ không cho phép tôi hai khoảng trắng tiếp theo)? Beacuse của khoảng trắng trước và sau "(. *)".
TechNyquist

6
Câu trả lời này là sai nhất 100%. Bằng chứng: 3v4l.org/LDLEM tại sao câu trả lời này có 15 UV?
mickmackusa
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.