Hapus sebagian string setelah karakter tertentu


144

Saya hanya ingin tahu bagaimana saya bisa menghapus semuanya setelah substring tertentu dalam PHP

ex:

Posted On April 6th By Some Dude

Saya ingin memilikinya sehingga menghapus semua teks termasuk, dan setelahnya, sub string "Dengan"

Terima kasih


1
Bagaimana jika sub string muncul dua kali (atau lebih)?
Bart Kiers

18
Sama seperti catatan, jika Anda melakukan ini sehingga Anda dapat mengambil konten orang lain dan menyajikannya di situs Anda sendiri, jangan .
ceejayoz

Saya setuju dengan ceejayoz. Ini terdengar seperti Anda mencoba menggunakan konten yang tidak benar-benar Anda akses dan Anda mencoba untuk menghapus referensi apa pun ke penulis asli. Itu tidak akan menyenangkan ...
selfawaresoup


1
Sebenarnya umum perlu melakukan hal semacam ini untuk alasan yang sah ketika bekerja dengan konten yang dihasilkan oleh CMS. Alasannya adalah Anda tidak pernah ingin mengacaukan kode aktual yang membuat cuplikan seperti ini karena Anda akan merusak pembaruan Anda; jadi, Anda membiarkannya melakukan hal itu, maka Anda melakukan hal Anda.
Nosajimiki

Jawaban:


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

Dalam bahasa Inggris yang sederhana: Beri saya bagian dari string mulai dari awal dan berakhir pada posisi di mana Anda pertama kali bertemu pembatas.


11
Bagaimana dengan "hanya lakukan ini jika" oleh "ada?
Alisso

3
Kamu benar. strpos akan mengembalikan FALSE jika "By" tidak ditemukan. substr akan mengembalikan string kosong jika panjang yang diberikan salah. Dalam praktiknya mungkin akan berguna untuk memeriksa apakah "By" ada dan kemudian hanya melakukan ini jika itu benar (jika tidak, tinggalkan string saja).
Austin Fitzpatrick

13
Ini berfungsi: strpos ($ variable, "By")? substr ($ variable, 0, strpos ($ variable, "By")): $ variable;
Noah Gary

Saya memberikan jawaban yang saya pikir membahas semuanya di bawah ini dan juga menjelaskan cara-cara untuk menangani segala macam hal seperti tidak peka huruf besar-kecil, banyak kejadian, dan ekspresi reguler. Jika ada yang ingin melakukan sesuatu yang lebih fleksibel atau tidak memiliki kendali atas input yang masuk, mungkin perlu dicoba.
azoundria

1
Berfungsi sempurna untuk saya @ Goahnary!
denis

106

Jika Anda menggunakan PHP 5.3+ lihat flag strstr $ before_needle ()

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

4
Terima kasih, ini adalah jawaban yang benar saat ini !
Matmarbon

59
Perhatikan bahwa itu akan kembali FALSEjika bagian dari string tidak ditemukan. Jadi solusinya bisa:echo strstr($s, 'By', true) ?: $s;
kenorb

6
^^^ jawaban kenorb harus menjadi jawaban yang diterima hari ini. Alternatif lain adalah explode(' By', $s)[0]IMHO squarecandy
Zack Morris

Memang, pemeriksaan keberadaan kenorb adalah cara untuk melakukannya, meskipun itu tidak diperlukan untuk menguji string.
BarryMode

Hanya di sini untuk mengatakan metode @ kenorb adalah payudaranya.
Quinn Comendant

32

Bagaimana dengan menggunakan explode:

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

Keuntungan:


@ bkac - Apa yang salah dengan mode lama asalkan bekerja dan tidak disusutkan?
squarecandy

3
Ini menghilangkan pemeriksaan tambahan untuk keberadaan string pembatas yang diperlukan oleh jawaban yang diterima.
David Cullen

17

Anda bisa melakukannya:

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

4
+1 Ini satu-satunya yang berfungsi jika karakter kontrol TIDAK ada (tidak seperti yang lain yang mengembalikan string kosong jika karakter kontrol tidak ada dalam string sumber)
Tom Auger

9

Salah satu metode adalah:

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

Ini adalah jawaban terbaik yang berfungsi bahkan jika By tidak ada dalam string, jawaban substr salah karena secara doest'nt ada gagal.
neoteknic

Ini tidak benar: fungsi tidak akan terpecah By, tetapi oleh karakter apa pun di parameter ke-2. Artinya, itu akan dibagi dengan salah satu Batau y. Secara teknis, itu tidak mendapatkan segalanya sebelum a By.
msb

Hati-hati: strtok akan mengembalikan bagian dari string setelah karakter jika itu adalah karakter pertama dalam string, misalnya, strtok('a:b', ':')akan kembali atetapi strtok(':b', ':')akan kembali b, bukan string kosong seperti yang Anda harapkan.
Quinn Comendant

6

Coba ini.

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; 
        }
    }

Pemakaian:

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

Anda akan jauh lebih baik menamai fungsi strip_after_string daripada sas dan memiliki basis kode yang penuh dengan inisialisasi samar. Ini adalah jawaban favorit saya yang paling mudah dibaca untuk pertanyaan ini.
Anther

5

Jawaban Austin berfungsi untuk contoh kasus Anda.

Secara umum, Anda sebaiknya melihat ke fungsi ekspresi reguler ketika substring yang Anda bagi mungkin berbeda di antara string:

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

+1, ini benar. Jika Anda ingin juga membagi pada "Penulis:" atau "Ditulis Oleh:" Atau "Digunakan dengan persetujuan dari:" mungkin akan lebih mudah untuk membuat ekspresi reguler. Namun, ketika saya tidak melakukan logika regex, saya cenderung menghindarinya karena mereka tampaknya segera menambah tingkat kerumitan pada kode (setidaknya bagi saya)
Austin Fitzpatrick

4

Anda dapat menggunakan listdan explodefungsi:

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

Ini yang paling akurat. Betapa saya berharap saya bisa memilih ini dua kali
John Max

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


2

Dengan menggunakan ekspresi reguler: $string = preg_replace('/\s+By.*$/', '', $string)


Harap sertakan beberapa penjelasan dengan jawaban hanya kode ini.
mickmackusa

2

Di bawah ini adalah metode yang paling efisien (dengan run-time) untuk memotong semuanya setelah By pertama dalam sebuah string. Jika By tidak ada, string lengkap dikembalikan. Hasilnya dalam $ 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"

Jika Anda tidak ingin menjadi case sensitive, gunakan stripo bukan strpos. Jika Anda berpikir By mungkin ada lebih dari sekali dan ingin memotong semuanya setelah kejadian terakhir, penggunaan strrpos .

Di bawah ini adalah metode yang kurang efisien tetapi membutuhkan lebih sedikit ruang kode. Metode ini juga lebih fleksibel dan memungkinkan Anda melakukan ekspresi reguler apa pun.

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

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

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

Misalnya, jika Anda ingin menghapus semuanya setelah hari:

$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"

Untuk case sensitive, tambahkan pengubah i seperti ini:

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

Untuk menyelesaikan semuanya dari yang terakhir Dengan jika Anda berpikir mungkin ada lebih dari satu, tambahkan tambahan. * Di awal seperti ini:

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

Tetapi di sini juga ada cara yang sangat ampuh untuk menggunakan preg_match untuk melakukan apa yang Anda coba lakukan:

$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
}

Ekspresi reguler mungkin tampak membingungkan pada awalnya, tetapi mereka bisa sangat kuat dan sahabat Anda setelah Anda menguasainya! Semoga berhasil!


1

Mengapa...

Ini mungkin berlebihan untuk kebutuhan kebanyakan orang, tetapi, ini membahas sejumlah hal yang tidak dijawab oleh masing-masing individu di atas. Dari barang-barang yang dibahas, tiga di antaranya dibutuhkan untuk kebutuhan saya. Dengan tanda kurung yang ketat dan menjatuhkan komentar, ini masih bisa dibaca hanya pada 13 baris kode.

Ini membahas hal-hal berikut:

  • Dampak kinerja menggunakan REGEX vs strrpos / strstr / strripos / stristr.
  • Menggunakan strripos / strrpos ketika karakter / string tidak ditemukan dalam string.
  • Menghapus dari sisi kiri atau kanan string (kejadian pertama atau terakhir).
  • Sensitivitas CaSe.
  • Menginginkan kemampuan untuk mengembalikan string asli tidak berubah jika pencarian char / string tidak ditemukan.

Pemakaian:

Kirim string asli, cari karakter / string, "R" / "L" untuk mulai di sisi kanan atau kiri, true / false untuk sensitivitas case. Misalnya, cari case "here" tidak sensitif, dalam string, mulailah dari sisi kanan.

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

Outputnya adalah "Now Here Are Somes Words". Mengubah "R" menjadi "L" akan menampilkan: "Sekarang".

Inilah fungsinya:

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
    }           

}

Jika Anda menurunkan jawaban pekerjaan saya, akan sangat dihargai jika Anda menyatakan alasannya.
Robert Mauro

0

Gunakan fungsi strstr .

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

echo $result ;

Parameter ketiga truememberi tahu fungsi untuk mengembalikan semuanya sebelum kemunculan pertama dari parameter kedua.


1
strtok($str, 'By')terlihat lebih sederhana
mu3

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

if (!empty($variable)) { echo $variable; } else { echo $initial; }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.