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
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
Câu trả lời:
$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.
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);
FALSE
nế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;
explode(' By', $s)[0]
IMHO của squarecandy
Cách sử dụng explode
:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
Ưu điểm:
$result[1]
sẽ trở lại Some Dude
trong ví dụ này)Một phương pháp sẽ là:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
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 B
hoặc y
. Về mặt kỹ thuật, nó không nhận được mọi thứ trước khi a By
.
strtok('a:b', ':')
sẽ trả về a
nhưng strtok(':b', ':')
sẽ trả về b
, không phải là một chuỗi trống như bạn mong đợi.
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",",");
?>
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);
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
preg_replace
cung cấp một cách:
$newText = preg_replace('/\bBy.*$/', '', $text);
Bằng cách sử dụng biểu thức chính quy: $string = preg_replace('/\s+By.*$/', '', $string)
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!
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:
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
}
}