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

Ikan Belgin
sumber
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
2
Alternatif solusi hebat stackoverflow.com/a/9315908/1518921 :)
Guilherme Nascimento
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.

Austin Fitzpatrick
sumber
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);
VolkerK
sumber
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:

squarecandy
sumber
@ 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;
JYelton
sumber
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
HADI
sumber
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",",");
?>
Tim Yobson
sumber
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);
jemfinch
sumber
+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 "
Salman A
sumber
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"));
Tim Cooper
sumber
2

preg_replace menawarkan satu cara:

$newText = preg_replace('/\bBy.*$/', '', $text);
outis
sumber
2

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

Ming-Tang
sumber
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!

azoundria
sumber
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
    }           

}
Robert Mauro
sumber
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.

Faisal
sumber
1
strtok($str, 'By')terlihat lebih sederhana
mu3
-2
$variable = substr($initial, 0, strpos($initial, "By"));

if (!empty($variable)) { echo $variable; } else { echo $initial; }
valente
sumber