特定の文字の後の文字列の一部を削除する


144

PHPの特定の部分文字列の後にすべてを削除する方法を知りたいだけです。

例:

Posted On April 6th By Some Dude

サブ文字列「By」を含むすべてのテキストが削除されるようにしたい

ありがとう


1
サブ文字列が2回(またはそれ以上)出現した場合はどうなりますか?
Bart Kiers、2010

18
注として、他の誰かのコンテンツを取得して自分のサイトに表示できるようにする場合は、しないください
ceejayoz

私はceejayozに同意します。これは、実際にはアクセスできないコンテンツを使用しようとしていて、元の作成者への参照を削除しようとしているように思えます。それはあまりいいことではありません...
selfawaresoup 2010

2
代替の優れたソリューションstackoverflow.com/a/9315908/1518921 :)
Guilherme Nascimento

1
CMSによって生成されたコンテンツを操作する場合、正当な理由でこの種のことを行う必要があるのが実際です。その理由は、更新を壊すため、このようなスニペットを作成する実際のコードをいじりたくないからです。だから、あなたはそれをその仕事に任せ、あなたはあなたの仕事をします。
Nosajimiki

回答:


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

平易な英語で:最初に始まり、最初に分娩器に遭遇した位置で終わる文字列の部分を教えてください。


11
「by」が存在する場合にのみこれを実行するのはどうですか?
Alisso

3
あなたが正しい。「By」が見つからない場合、strposはFALSEを返します。指定された長さがfalseの場合、substrは空の文字列を返します。実際には、「By」が存在するかどうかを確認し、存在する場合にのみこれを実行すると便利です(そうでない場合は、文字列をそのままにします)。
オースティンフィッツパトリック

13
これは機能します:strpos($ variable、 "By")?substr($ variable、0、strpos($ variable、 "By")):$ variable;
Noah Gary

私は以下にすべてに対処すると思う答えを置き、大文字と小文字を区別しない、複数の出現、正規表現など、あらゆる種類の事柄に対処する方法を説明します。誰かがもっと柔軟なことをしたい場合や、入ってくる入力を制御できない場合は、おそらくチェックする価値があります。
azoundria 2017

1
私にぴったりの作品@Goahnary!
denis

106

PHP 5.3以降を使用している場合は、strstr ()の $ before_needleフラグを確認してください。

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

4
ありがとう、これが最近の実際の正解です!
Matmarbon 2014年

59
FALSE文字列の一部が見つからない場合に返されることに注意してください。解決策が考えられて:echo strstr($s, 'By', true) ?: $s;
kenorb

6
^^^ケノーブの答えは、今日受け入れられた答えであるべきです。別の代替案は、squarecandyのexplode(' By', $s)[0]私見
ザックモリス

実際、文字列をテストする必要はありませんが、kenorbの存在チェックはそれを行う方法です。
BarryMode 2017年

@kenorbのメソッドはおっぱいです。
Quinn Comendant、

32

使用についてexplode

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

利点:


@bkac-それが機能し、減価償却されていない限り、旧式の何が問題になっていますか?
squarecandy 2016年

3
これにより、受け入れられた回答に必要な区切り文字列の存在についての余分なチェックが不要になります。
David Cullen

17

あなたがすることができます:

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

4
+1これは、制御文字が存在しない場合に機能する唯一のものです(ソース文字列に制御文字が存在しない場合に空の文字列を返す他のものとは異なります)
Tom Auger

9

1つの方法は次のとおりです。

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

これは、Byが文字列に含まれていなくても機能する最良の回答です。substrの回答は間違っているため、存在しないため失敗します。
neoteknic 2017年

これは不正解です。関数はで分割されませんByが、2番目のパラメーターの任意の文字で分割されます。Bつまり、またはで分割されますy。技術的には、の前にすべてを取得しているわけではありませんBy
msb

注意してください:はstrtokは、文字列の部分を返します、それは文字列の最初の文字であれば文字、例えば、strtok('a:b', ':')返されaたがstrtok(':b', ':')返されますb、あなたが期待するように空の文字列、ありません。
Quinn Comendant、

6

これを試して。

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

sasの代わりに関数strip_after_stringに名前を付け、不可解な初期化でいっぱいのコードベースを用意することをお勧めします。これは、この質問に対する私の最も読みやすい答えです。

5

オースティンの答えはあなたの例の場合に有効です。

より一般的には、分割する部分文字列が文字列間で異なる可能性がある場合は、正規表現関数を調べることをお勧めします。

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

+1、これは正しいです。「作成者:」または「作成者:」または「同意を得て使用:」でも分割したい場合は、正規表現を作成するのがおそらく最も簡単でしょう。ただし、正規表現ロジックを実行しない場合は、コードに複雑さのレベルを(少なくとも私にとっては)すぐに追加するように思われるため、回避する傾向があります
Austin Fitzpatrick

4

あなたは使用することができますlistし、explode機能:

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

これが最も正確です。どのように私はこれに2度投票したいですか
John Max



2

正規表現を使用して: $string = preg_replace('/\s+By.*$/', '', $string)


このコードのみの回答には説明を含めてください。
mickmackusa

2

以下は、文字列内の最初の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"

大文字と小文字を区別したくない場合は、strposの代わりにstriposを使用してください。あなたが考える場合によっては複数回存在し、最後に出現した後にカットすべて、使用したい場合がありますのstrrpos

以下は効率の悪い方法ですが、必要なコードスペースが少なくなります。この方法はさらに柔軟性が高く、任意の正規表現を実行できます。

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April 6th"

たとえば、1日の後にすべてを削除したい場合は、次のようにします。

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

正規表現は最初は混乱するように思えるかもしれませんが、習得すれば非常に強力で親友になる可能性があります。幸運を!


1

なぜ...

これはほとんどの人のニーズにとってはやり過ぎかもしれませんが、上記の個々の回答では対応できない多くのことに対処します。それが扱う項目のうち、そのうちの3つは私のニーズに必要でした。きちんと括弧で囲んでコメントを削除しても、これはまだわずか13行のコードで読みやすいままです。

これにより、次の問題が解決されます。

  • REGEXとstrrpos / strstr / strripos / stristrの使用によるパフォーマンスへの影響。
  • 文字列に文字/文字列が見つからない場合のstrripos / strrposの使用。
  • 文字列の左側または右側から削除(最初または最後の出現)。
  • CaSe感度。
  • 検索文字/文字列が見つからない場合、元の文字列を変更せずに戻す機能が必要です。

使用法:

元の文字列を送信し、文字または文字列を検索します。「R」/「L」で右側または左側から開始します。大文字と小文字を区別する場合はtrue / falseです。たとえば、「ここ」で大文字と小文字を区別せず、文字列で右側から検索します。

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
    }           

}

私の有効な回答に反対票を投じる場合は、その理由を述べていただければ幸いです。
Robert Mauro

0

strstr関数を使用します。

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

echo $result ;

3番目のパラメーターtrueは、2番目のパラメーターが最初に現れる前にすべてを返すように関数に指示します。


1
strtok($str, 'By')よりシンプルに見える
mu3 '19年

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

if (!empty($variable)) { echo $variable; } else { echo $initial; }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.