删除特定字符后的string部分

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

例如:

Posted On April 6th By Some Dude 

我想这样做,它将删除所有的文本,包括之后,子string“By”

谢谢

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

用简单的英语:给我的string的一部分开始在开始和结束在你第一次遇到拆分器的位置。

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

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

如何使用explode

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

优点:

  • 非常可读/可理解
  • 如果分隔符string(本例中为“By”)不存在,则返回完整的string。 (不会像其他答案一样返回FALSE。)
  • 不需要任何正则expression式。
    • “正则expression式就像一种特别辛辣的辣酱 – 只有在适当的时候,才能适度地使用和保持克制。”
    • 正则expression式比爆炸慢 (我认为preg_split是速度相似的其他答案中build议的其他正则expression式选项)
  • 如果需要的话,也可以使string的第二部分可用( $result[1]在本例中将返回Some Dude

你可以这样做:

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

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

更一般的情况是,当你正在分裂的子string在string之间可能会有所不同的时候,你应该好好研究一下正则expression式函数 :

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

一种方法是:

 $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",","); ?> 
 $var = "Posted On April 6th By Some Dude"; $new_var = substr($var, 0, strpos($var, " By")); 

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

preg_replace提供了一种方法:

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

您可以使用listexplodefunction:

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

使用strstr函数。

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

第三个参数true告诉函数在第一个参数出现之前返回所有的东西。

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

下面是一个效率较低的方法,但占用较less的代码空间。 这个方法也比较灵活,可以让你做任何正则expression式。

 $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}[az]{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); 

如果你认为可能有不止一个,在开始时join一个额外的*。

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

正则expression式起初可能看起来很混乱,但是一旦掌握了它们,它们可以变得非常强大,而且是最好的朋友! 祝你好运!