删除字符串中某个字符后面的部分

我只是想知道如何删除 PHP 中某个子字符串之后的所有内容

例如:

Posted On April 6th By Some Dude

我希望它可以删除所有文本,包括后面的子字符串“ By”

谢谢

337599 次浏览
$variable = substr($variable, 0, strpos($variable, "By"));

用简单的英语说: 给我字符串中从开始到结束的部分,在你第一次遇到分隔符的位置。

你可以这样做:

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

这是一个正则表达式替换函数,它找到字符串‘ By’和后面的任意数量的字符(.*) ,并用一个空字符串('')替换它们,将结果存储在搜索的同一个变量($posted)中。

如果在输入字符串中找不到 [space]By,则该字符串保持不变。

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

奥斯汀的答案适用于你的案例。

更一般的情况是,当分割的子字符串可能在不同字符串之间有所不同时,您最好查看 正则表达式函数:

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

如果您正在使用 PHP 5.3 + ,请查看 < a href = “ http://docs.PHP.net/function. strstr”rel = “ norefrer”> strstr ()的 $before _ note 标志

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

通过使用正则表达式: $string = preg_replace('/\s+By.*$/', '', $string)

使用 explode怎么样:

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

优点:

你可以使用 listexplode函数:

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

一种方法是:

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

试试这个。

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",",");
?>

使用 斯特拉函数。

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


echo $result ;

第三个参数 true告诉函数在第二个参数第一次出现之前返回所有内容。

下面是最有效的方法(通过运行时)来切断字符串中第一个 作者之后的所有内容。如果 作者不存在,则返回完整的字符串。结果在 $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"

如果不想区分大小写,可以使用 脱衣舞而不是 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);

如果您认为可能有不止一个 作者,那么可以添加一个额外的 作者。* at the start like this:

$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行是可读的。

这涉及以下方面:

  • 使用 REGEX 对 strrpos/strstr/strripos/stristr 性能的影响。
  • 在字符串中找不到字符/字符串时使用 strripos/strrpos。
  • 从字符串的左侧或右侧移除(第一次或最后一次出现)。
  • 大小写敏感性
  • 希望在搜索 char/string 未找到的情况下能够返回原始字符串。

用法:

发送原始字符串,搜索 char/string,“ R”/“ L”表示从右边或左边开始,true/false 表示大小写敏感性。例如,在字符串中搜索不区分大小写的“ here”,从右边开始。

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

输出将是“ Now Here Are Some Words”。将“ 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; }

如前所述,如果在字符串中不存在搜索的子字符串,那么当前接受的解决方案将不检查从 strpos返回的 false值。其他经过高度投票的答案使用 strstr,但在文档中不推荐使用:

注:

如果只想确定特定的针是否出现在 大海捞针,使用更快和更少的内存密集型函数 strpos () 取而代之。

下面是一个解决上述问题的函数:

function stripFromFirstOccurrence($str, $find) {
$pos = strpos($str, $find);
return $pos === false ? $str : substr($str, 0, $pos);
}

如果喜欢,也可以写一行:

$stripped = ($pos = strpos($str, $find)) === false ? $str : substr($str, 0, $pos);