Xóa phần của chuỗi sau một ký tự nhất định


144

Tôi chỉ tự hỏi làm thế nào tôi có thể loại bỏ mọi thứ sau một chuỗi con nhất định trong PHP

Ví dụ:

Posted On April 6th By Some Dude

Tôi muốn có nó để nó xóa tất cả văn bản bao gồm và sau đó, chuỗi con "By"

Cảm ơn


1
Điều gì xảy ra nếu chuỗi phụ xảy ra hai lần (hoặc nhiều hơn)?
Bart Kiers

18
Cũng như một lưu ý, nếu bạn đang làm điều này để bạn có thể lấy nội dung của người khác và trình bày nó trên trang web của riêng bạn, thì không .
ceejayoz

Tôi đồng ý với ceejayoz. Điều này nghe có vẻ giống như bạn đang cố gắng sử dụng nội dung mà bạn không thực sự có quyền truy cập và bạn đang cố xóa bất kỳ tham chiếu nào đến tác giả gốc. Điều đó sẽ không tốt lắm ...
selfawaresoup


1
Điều thực sự phổ biến là cần phải làm điều này vì những lý do chính đáng khi làm việc với nội dung được tạo bởi một CMS. Lý do là bạn không bao giờ muốn gây rối với mã thực tế tạo ra một đoạn mã như thế này vì bạn sẽ phá vỡ các cập nhật của mình; Vì vậy, bạn để nó làm việc của nó, sau đó bạn làm việc của bạn.
Nosajimiki

Câu trả lời:


292
$variable = substr($variable, 0, strpos($variable, "By"));

Trong tiếng Anh đơn giản: Hãy cho tôi một phần của chuỗi bắt đầu từ đầu và kết thúc tại vị trí đầu tiên bạn bắt gặp dấu phân cách.


11
Điều gì về "chỉ làm điều này nếu" bởi "tồn tại?
Alisso

3
Bạn đúng. strpose sẽ trả về SAI nếu không tìm thấy "By". chất nền sẽ trả về một chuỗi rỗng nếu độ dài cho là sai. Trong thực tế, có lẽ sẽ hữu ích khi kiểm tra xem "Bằng" có tồn tại hay không và sau đó chỉ thực hiện việc này nếu có (nếu không chỉ để lại chuỗi).
Austin Fitzpatrick

13
Điều này hoạt động: strpose ($ biến, "By")? chất nền ($ biến, 0, strpose ($ biến, "By")): $ biến;

Tôi đặt một câu trả lời mà tôi nghĩ là giải quyết mọi thứ bên dưới và cũng giải thích các cách để đối phó với tất cả các loại như trường hợp không nhạy cảm, nhiều lần xuất hiện và các biểu thức thông thường. Nếu bất cứ ai muốn làm bất cứ điều gì linh hoạt hơn hoặc không có quyền kiểm soát đầu vào sắp tới thì có lẽ nên kiểm tra.
azoundria

1
Hoạt động hoàn hảo cho tôi @Goahnary!
chối

106

Nếu bạn đang sử dụng PHP 5.3+, hãy xem cờ $ before_needle của strstr ()

$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);

4
Cảm ơn, đây là câu trả lời đúng thực tế ngày nay !
Matmarbon

59
Lưu ý rằng nó sẽ trả về FALSEnếu không tìm thấy một phần của chuỗi. Vì vậy, giải pháp có thể là:echo strstr($s, 'By', true) ?: $s;
kenorb 22/2/2015

6
^^ ^ Câu trả lời của kenorb nên là câu trả lời được chấp nhận ngày hôm nay. một lựa chọn khác sẽ là explode(' By', $s)[0]IMHO của squarecandy
Zack Morris

Thật vậy, kiểm tra sự tồn tại của kenorb là cách để làm điều đó, mặc dù không bắt buộc phải kiểm tra chuỗi.
BarryMode

Chỉ cần ở đây để nói phương pháp của @ kenorb là ngực.
Quinn Comendant

32

Cách sử dụng explode:

$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];

Ưu điểm:


@bkac - Có gì sai với kiểu cũ miễn là nó hoạt động và không được khấu hao?
squarecandy

3
Điều này giúp loại bỏ việc kiểm tra thêm cho sự tồn tại của chuỗi phân cách theo yêu cầu của câu trả lời được chấp nhận.
David Cullen

17

Bạn có thể làm:

$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;

4
+1 Đây là duy nhất hoạt động nếu các ký tự điều khiển KHÔNG có mặt (không giống như các ký tự điều khiển khác trả về một chuỗi trống nếu các ký tự điều khiển không có trong chuỗi nguồn)
Tom Auger

9

Một phương pháp sẽ là:

$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th

Đây là câu trả lời tốt nhất mà nó hoạt động ngay cả khi By không có trong chuỗi, câu trả lời cơ sở là sai bởi vì doestest không tồn tại nên nó thất bại.
neoteknic

Điều này không chính xác: hàm sẽ không được phân chia bởi By, nhưng bởi bất kỳ char nào trong tham số thứ 2. Có nghĩa, nó sẽ phân chia bởi một trong hai Bhoặc y. Về mặt kỹ thuật, nó không nhận được mọi thứ trước khi a By.
msb

Hãy cẩn thận: strtok sẽ trả về 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

6

Thử cái này.

function strip_after_string($str,$char)
    {
        $pos=strpos($str,$char);    
        if ($pos!==false) 
        {
            //$char was found, so return everything up to it.
            return substr($str,0,$pos);
        } 
        else 
        {
            //this will return the original string if $char is not found.  if you wish to return a blank string when not found, just change $str to ''
            return $str; 
        }
    }

Sử dụng:

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>

Bạn sẽ tốt hơn nhiều khi đặt tên hàm là dải_after_ chuỗi thay vì sas và có một cơ sở mã chứa đầy các ký hiệu khó hiểu. Đây là câu trả lời yêu thích nhất của tôi cho câu hỏi này mặc dù.
Bao phấn

5

Câu trả lời của Austin hoạt động cho trường hợp ví dụ của bạn.

Tổng quát hơn, bạn sẽ làm tốt việc xem xét các hàm biểu thức chính quy khi chuỗi con bạn chia tách có thể khác nhau giữa các chuỗi:

$ biến = preg numplace ('/ By. * /', '', $ biến);

+1, Điều này đúng. Nếu bạn cũng muốn phân tách trên "Tác giả:" hoặc "Được viết bởi:" Hoặc "Được sử dụng với sự đồng ý của:" có thể dễ dàng nhất để thực hiện một biểu thức thông thường. Mặc dù vậy, khi tôi không thực hiện bất kỳ logic regex nào, tôi có xu hướng tránh chúng vì chúng dường như ngay lập tức thêm một mức độ phức tạp vào mã (ít nhất là với tôi)
Austin Fitzpatrick

4

Bạn có thể sử dụng listvà các explodechức năng:

list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "

Đây là chính xác nhất. Làm thế nào tôi muốn tôi có thể bỏ phiếu cho điều này hai lần
John Max

4
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));


2

Bằng cách sử dụng biểu thức chính quy: $string = preg_replace('/\s+By.*$/', '', $string)


Vui lòng bao gồm một số giải thích với câu trả lời chỉ có mã này.
mickmackusa

2

Dưới đây là phương pháp hiệu quả nhất (bằng cách run-time) để cắt đứt tất cả mọi thứ sau khi người đầu tiên bởi trong một chuỗi. Nếu By không tồn tại, chuỗi đầy đủ được trả về. Kết quả là trong $ sResult.

$sInputString = "Posted On April 6th By Some Dude";
$sControl = "By";

//Get Position Of 'By'
$iPosition = strpos($sInputString, " ".$sControl);
if ($iPosition !== false)
  //Cut Off If String Exists
  $sResult = substr($sInputString, 0, $iPosition);
else
  //Deal With String Not Found
  $sResult = $sInputString;

//$sResult = "Posted On April 6th"

Nếu bạn không muốn phân biệt chữ hoa chữ thường, hãy sử dụng biểu đồ thay vì strpose . Nếu bạn nghĩ By có thể tồn tại hơn một lần và muốn cắt mọi thứ sau lần xuất hiện cuối cùng, hãy sử dụng strrpose .

Dưới đây là một phương pháp ít hiệu quả hơn nhưng nó chiếm ít không gian mã hơn. Phương pháp này cũng linh hoạt hơn và cho phép bạn thực hiện bất kỳ biểu thức chính quy nào.

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April 6th"

Ví dụ: nếu bạn muốn xóa mọi thứ sau ngày:

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "[0-9]{1,2}[a-z]{2}"; //1 or 2 numbers followed by 2 lowercase letters.

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April"

Đối với trường hợp không nhạy cảm, hãy thêm công cụ sửa đổi i như thế này:

$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);

Để vượt qua mọi thứ cuối cùng Bởi nếu bạn nghĩ có thể có nhiều hơn một, hãy thêm một phần bổ sung. * Ở đầu như thế này:

$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);

Nhưng đây cũng là một cách thực sự mạnh mẽ mà bạn có thể sử dụng preg_match để làm những gì bạn có thể đang cố gắng thực hiện:

$sInputString = "Posted On April 6th By Some Dude";

$pPattern = "'Posted On (.*?) By (.*?)'s";
if (preg_match($pPattern, $sInputString, $aMatch)) {
  //Deal With Match
  //$aMatch[1] = "April 6th"
  //$aMatch[2] = "Some Dude"
} else {
  //No Match Found
}

Biểu hiện thông thường ban đầu có vẻ khó hiểu nhưng chúng có thể thực sự mạnh mẽ và là người bạn tốt nhất của bạn một khi bạn thành thạo chúng! Chúc may mắn!


1

Tại sao...

Điều này có thể là quá mức cần thiết cho hầu hết các nhu cầu của mọi người, nhưng, nó giải quyết một số điều mà mỗi cá nhân trả lời ở trên không. Trong số các mặt hàng mà nó giải quyết, ba trong số chúng là cần thiết cho nhu cầu của tôi. Với dấu ngoặc chặt và bỏ các bình luận, điều này vẫn có thể đọc được chỉ với 13 dòng mã.

Địa chỉ này như sau:

  • Tác động hiệu suất của việc sử dụng REGEX so với strrpose / strstr / strripos / stristr.
  • Sử dụng strripos / strrpose khi không tìm thấy ký tự / chuỗi trong chuỗi.
  • Loại bỏ từ bên trái hoặc bên phải của chuỗi (lần xuất hiện đầu tiên hoặc cuối cùng).
  • Độ nhạy CaSe.
  • Muốn có khả năng trả về chuỗi gốc không bị thay đổi nếu không tìm thấy char / chuỗi.

Sử dụng:

Gửi chuỗi gốc, tìm kiếm char / chuỗi, "R" / "L" để bắt đầu ở bên phải hoặc bên trái, đúng / sai cho độ nhạy trường hợp. Ví dụ: tìm kiếm trường hợp "ở đây" không nhạy cảm, trong chuỗi, bắt đầu bên phải.

echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);

Đầu ra sẽ là "Bây giờ là một số từ". Thay đổi "R" thành "L" sẽ xuất ra: "Bây giờ".

Đây là chức năng:

function TruncStringAfterString($origString,$truncChar,$startSide,$caseSensitive)
{
    if ($caseSensitive==true && strstr($origString,$truncChar)!==false)
    {
        // IF START RIGHT SIDE:
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strrpos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return strstr($origString,$truncChar,true);
        }           
    }
    elseif ($caseSensitive==false && stristr($origString,$truncChar)!==false)
    {           
        // IF START RIGHT SIDE: 
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strripos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return stristr($origString,$truncChar,true);
        }
    }       
    else
    {   // NOT found - return origString untouched
        return $origString;     // Nothing to do here
    }           

}

Nếu bạn downvote câu trả lời làm việc của tôi, nó sẽ được đánh giá cao nó bạn đã nêu lý do tại sao.
Robert Mauro

0

Sử dụng hàm strstr .

<?php
$myString = "Posted On April 6th By Some Dude";
$result = strstr($myString, 'By', true);

echo $result ;

Tham số thứ ba truecho biết hàm trả về mọi thứ trước khi xuất hiện lần đầu tiên của tham số thứ hai.


1
strtok($str, 'By')trông đơn giản hơn
mu3

-2
$variable = substr($initial, 0, strpos($initial, "By"));

if (!empty($variable)) { echo $variable; } else { echo $initial; }
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.