ฉันแค่สงสัยว่าฉันจะลบทุกอย่างหลังจากสตริงย่อยบางอย่างใน PHP
อดีต:
Posted On April 6th By Some Dude
ฉันต้องการที่จะมีมันเพื่อที่จะลบข้อความทั้งหมดรวมถึงและหลังจากที่สตริงย่อย "โดย"
ขอบคุณ
ฉันแค่สงสัยว่าฉันจะลบทุกอย่างหลังจากสตริงย่อยบางอย่างใน PHP
อดีต:
Posted On April 6th By Some Dude
ฉันต้องการที่จะมีมันเพื่อที่จะลบข้อความทั้งหมดรวมถึงและหลังจากที่สตริงย่อย "โดย"
ขอบคุณ
คำตอบ:
$variable = substr($variable, 0, strpos($variable, "By"));
ในภาษาอังกฤษธรรมดา: ให้ฉันเป็นส่วนหนึ่งของสตริงเริ่มต้นที่จุดเริ่มต้นและสิ้นสุดที่ตำแหน่งที่คุณพบผู้กระทำความผิดครั้งแรก
หากคุณใช้ PHP 5.3 ขึ้นไปดูที่ธง before_needle ของstrstr ()
$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
FALSE
ถ้าส่วนของสตริงไม่พบ วิธีแก้ปัญหาอาจเป็น:echo strstr($s, 'By', true) ?: $s;
explode(' By', $s)[0]
IMHO ของ squarecandy
วิธีใช้explode
:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
ข้อดี:
$result[1]
จะกลับมาSome Dude
ในตัวอย่างนี้)คุณสามารถทำได้:
$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;
วิธีหนึ่งจะเป็น:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
By
แต่ด้วยอักขระใด ๆ ในพารามิเตอร์ที่ 2 ความหมายก็จะแยกโดยทั้งหรือB
ในทางเทคนิคแล้วมันไม่ได้รับทุกอย่างก่อนy
By
strtok('a:b', ':')
จะกลับมาa
แต่strtok(':b', ':')
จะกลับมาb
ไม่ใช่สตริงที่ว่างเปล่าตามที่คุณคาดหวัง
ลองสิ่งนี้
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;
}
}
การใช้งาน:
<?php
//returns Apples
$clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>
คำตอบของ Austin เหมาะสำหรับกรณีตัวอย่างของคุณ
โดยทั่วไปแล้วคุณควรศึกษาฟังก์ชั่นการแสดงออกปกติเมื่อสตริงย่อยที่คุณแยกอาจแตกต่างกันระหว่างสตริง:
$ variable = preg_replace ('/ By. * /', '', $ variable);
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
preg_replace
เสนอวิธีหนึ่ง:
$newText = preg_replace('/\bBy.*$/', '', $text);
โดยใช้การแสดงออกปกติ: $string = preg_replace('/\s+By.*$/', '', $string)
ด้านล่างเป็นวิธีที่มีประสิทธิภาพมากที่สุด (ตามเวลาทำงาน) เพื่อตัดทุกอย่างหลังจากแรกโดยในสตริง หากByไม่มีอยู่สตริงทั้งหมดจะถูกส่งคืน ผลลัพธ์จะเป็น $ 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"
หากคุณไม่ต้องการให้ตรงตามตัวพิมพ์ใหญ่ - เล็กให้ใช้striposแทน strpos หากคุณคิดว่าโดยอาจจะมีอยู่มากกว่าหนึ่งครั้งและต้องการที่จะตัดทุกอย่างหลังจากที่เกิดขึ้นที่ผ่านมาการใช้strrpos
ด้านล่างเป็นวิธีที่มีประสิทธิภาพน้อยลง แต่ใช้พื้นที่โค้ดน้อยลง วิธีนี้มีความยืดหยุ่นมากกว่าและช่วยให้คุณสามารถแสดงออกได้ตามปกติ
$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";
$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);
//$sResult = "Posted On April 6th"
ตัวอย่างเช่นหากคุณต้องการลบทุกอย่างหลังจากวันที่:
$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 ดังนี้:
$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);
หากต้องการให้ทุกอย่างผ่านไปได้โดยเมื่อคุณคิดว่าอาจมีมากกว่าหนึ่งให้เพิ่มพิเศษ * ที่จุดเริ่มต้นเช่นนี้:
$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);
แต่นี่ก็เป็นวิธีที่ทรงพลังจริงๆคุณสามารถใช้ preg_match เพื่อทำสิ่งที่คุณอาจพยายามทำ:
$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
}
การแสดงออกปกติอาจดูสับสนในตอนแรก แต่พวกเขาอาจมีพลังมากและเป็นเพื่อนที่ดีที่สุดของคุณเมื่อคุณเชี่ยวชาญ! โชคดี!
ทำไม...
นี่น่าจะเกินความจำเป็นของคนส่วนใหญ่ แต่มันก็ตอบสนองสิ่งต่าง ๆ ที่แต่ละคำตอบไม่ได้ ของที่อยู่มันมีสามรายการที่ฉันต้องการ ด้วยการถ่ายคร่อมอย่างแน่นหนาและการปล่อยความคิดเห็นสิ่งนี้ยังคงสามารถอ่านได้ที่รหัสเพียง 13 บรรทัด
ที่อยู่นี้ต่อไปนี้:
การใช้งาน:
ส่งสตริงต้นฉบับค้นหาอักขระ / สตริง "R" / "L" เพื่อเริ่มต้นทางด้านขวาหรือด้านซ้ายจริง / เท็จสำหรับความไวของตัวพิมพ์เล็ก ตัวอย่างเช่นค้นหาตัวพิมพ์เล็กและใหญ่ที่ด้านขวาเป็นสตริง
echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);
การส่งออกจะเป็น "ตอนนี้มีบางคำ" การเปลี่ยน "R" เป็น "L" จะเป็นผลลัพธ์: "Now"
นี่คือฟังก์ชั่น:
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
}
}
$variable = substr($initial, 0, strpos($initial, "By"));
if (!empty($variable)) { echo $variable; } else { echo $initial; }