it-swarm.com.de

Einen Teil einer Zeichenfolge entfernen, jedoch nur, wenn er sich am Ende der Zeichenfolge befindet

Ich muss einen Teilstring eines Strings entfernen, aber nur, wenn er am END des Strings ist.

entfernen Sie beispielsweise "string" am Ende der folgenden Zeichenfolgen:

"this is a test string" ->  "this is a test "
"this string is a test string" - > "this string is a test "
"this string is a test" -> "this string is a test"

Irgendwelche Ideen ? Wahrscheinlich eine Art preg_replace, aber wie?

63
Dylan

Sie werden die Verwendung des $-Zeichens bemerken, das das Ende einer Zeichenfolge bezeichnet:

$new_str = preg_replace('/string$/', '', $str);

Wenn es sich bei der Zeichenfolge um eine vom Benutzer angegebene Variable handelt, empfiehlt es sich, sie zuerst durch preg_quote auszuführen:

$remove = $_GET['remove']; // or whatever the case may be
$new_str = preg_replace('/'. preg_quote($remove, '/') . '$/', '', $str);
104
Tim Cooper

Die Verwendung von regexp schlägt möglicherweise fehl, wenn die Teilzeichenfolge Sonderzeichen enthält.

Folgendes funktioniert mit beliebigen Zeichenketten:

$substring = 'string';
$str = "this string is a test string";
if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring));
20
Skrol29

Ich habe diese beiden Funktionen für den linken und rechten Schnitt einer Zeichenfolge geschrieben:

/**
 * @param string    $str           Original string
 * @param string    $needle        String to trim from the end of $str
 * @param bool|true $caseSensitive Perform case sensitive matching, defaults to true
 * @return string Trimmed string
 */
function rightTrim($str, $needle, $caseSensitive = true)
{
    $strPosFunction = $caseSensitive ? "strpos" : "stripos";
    if ($strPosFunction($str, $needle, strlen($str) - strlen($needle)) !== false) {
        $str = substr($str, 0, -strlen($needle));
    }
    return $str;
}

/**
 * @param string    $str           Original string
 * @param string    $needle        String to trim from the beginning of $str
 * @param bool|true $caseSensitive Perform case sensitive matching, defaults to true
 * @return string Trimmed string
 */
function leftTrim($str, $needle, $caseSensitive = true)
{
    $strPosFunction = $caseSensitive ? "strpos" : "stripos";
    if ($strPosFunction($str, $needle) === 0) {
        $str = substr($str, strlen($needle));
    }
    return $str;
}
8
Bas

Ich denke, Sie könnten einen regulären Ausdruck verwenden, der string und dann Ende des Strings, gekoppelt mit der Funktion preg_replace() , entsprechen würde.


So etwas sollte gut funktionieren:

$str = "this is a test string";
$new_str = preg_replace('/string$/', '', $str);


Anmerkungen :

  • string passt ... gut ... string
  • und $ bedeutet Ende der Zeichenfolge

Weitere Informationen finden Sie im Abschnitt Pattern Syntax des Handbuchs PHP.

7
Pascal MARTIN

preg_replace und dieses Muster:/string\z/i 

\ z bedeutet das Ende der Zeichenkette

http://tr.php.net/preg_replace

2

WENN Ihnen die Leistung nichts ausmacht UND der Teil der Zeichenfolge nur am Ende der Zeichenfolge platziert werden kann, DANN können Sie Folgendes tun:

$string = "this is a test string";
$part = "string";
$string = implode( $part, array_slice( explode( $part, $string ), 0, -1 ) );
echo $string;
// OUTPUT: "this is a test "
0
Marco Panichi

Sie können rtrim () verwenden.

php > echo rtrim('this is a test string', 'string');
this is a test 

Dies funktioniert nur in einigen Fällen, da 'string' nur eine Zeichenmaske ist und die Reihenfolge der Zeichen nicht berücksichtigt wird.

0
umpirsky