在某个字符后删除字符串的一部分

时间:2010-04-06 22:01:37

标签: php string

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

例如:

Posted On April 6th By Some Dude

我想拥有它以便删除所有文本,包括和之后的子字符串“By”

由于

16 个答案:

答案 0 :(得分:236)

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

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

答案 1 :(得分:89)

如果你正在使用PHP 5.3+,请查看strstr()的$ before_needle标志

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

答案 2 :(得分:24)

如何使用explode

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

优点:

答案 3 :(得分:17)

你可以这样做:

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

答案 4 :(得分:7)

一种方法是:

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

答案 5 :(得分:5)

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

更一般地说,当您拆分的子字符串在字符串之间可能不同时,您最好查看regular expression functions

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

答案 6 :(得分:5)

试试这个。

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

答案 7 :(得分:3)

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

答案 8 :(得分:2)

preg_replace提供了一种方式:

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

答案 9 :(得分:2)

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

答案 10 :(得分:2)

您可以使用listexplode函数:

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

答案 11 :(得分:2)

以下是在字符串中第一个 By 之后切断所有内容的最有效方法(按运行时)。如果 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。如果您认为 By 可能不止一次出现并希望在最后一次出现后切断所有内容,请使用 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);

如果您认为可能有多个 By ,那么要在最后添加一个。*,如下所示:

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

正则表达式起初可能看起来令人困惑,但是一旦你掌握它们,它们就会非常强大并成为你最好的朋友!祝你好运!

答案 12 :(得分:0)

使用strstr功能。

Error in as.POSIXlt.default(x, tz = tz(x)) : 
     do not know how to convert 'x' to class “POSIXlt” 

第三个参数<?php $myString = "Posted On April 6th By Some Dude"; $result = strstr($myString, 'By', true); echo $result ; 告诉函数在第一次出现第二个参数之前返回所有内容。

答案 13 :(得分:0)

为什么...

这可能满足大多数人的需求,但是,它解决了上面每个答案都不能解决的许多问题。在它处理的项目中,我需要其中三个。通过用尖括号括起来并删除注释,仅需13行代码,仍可以保持可读性。

这解决了以下问题:

  • 使用REGEX对strrpos / strstr / strripos / stristr的性能影响。
  • 在字符串中未找到字符/字符串时,使用strripos / strrpos。
  • 从字符串的左侧或右侧删除(第一次或最后一次出现)。
  • CaSe灵敏度。
  • 希望能够在未找到搜索字符的情况下原封不动地返回原始字符串。

用法:

发送原始字符串,搜索字符/字符串,“ 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
    }           

}

答案 14 :(得分:0)

嘿,我认为这对于想要替换字符位于“By”之后的人可能很有用,例如在他给出的文本中 20 号 > 他的字符串的位置,所以如果你想忽略 by 你应该 add + 2 到位置然后这将忽略第 20 个位置,它会在到达后替换所有如果您提供要替换的文本的确切字符长度,它将起作用。

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

答案 15 :(得分:-1)

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

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