php - online - preg_replace_callback
Quita una parte de una cuerda, pero solo cuando esté al final de la cuerda (6)
Necesito eliminar una subcadena de una cadena, pero solo cuando esté al final de la cadena.
por ejemplo, eliminar ''cadena'' al final de las siguientes cadenas:
"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"
Algunas ideas ? Probablemente algún tipo de preg_replace, pero ¿cómo?
El uso de regexp puede fallar si la subcadena tiene caracteres especiales.
Lo siguiente funcionará con cualquier cadena:
$substring = ''string'';
$str = "this string is a test string";
if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring));
Escribí estas dos funciones para el ajuste izquierdo y derecho de una cuerda:
/**
* @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;
}
Observará el uso del carácter $
, que denota el final de una cadena:
$new_str = preg_replace(''/string$/'', '''', $str);
Si la cadena es una variable proporcionada por el usuario, es una buena idea ejecutarla primero a través de preg_quote
:
$remove = $_GET[''remove'']; // or whatever the case may be
$new_str = preg_replace(''/''. preg_quote($remove, ''/'') . ''$/'', '''', $str);
Puedes usar rtrim() .
php > echo rtrim(''this is a test string'', ''string'');
this is a test
Esto solo funcionará en algunos casos, ya que ''string''
es solo una máscara de caracteres y la orden de caracteres no será respetada.
Supongo que podría usar una expresión regular , que coincidiría con la string
y, luego, el final de la cadena , junto con la función preg_replace()
.
Algo así debería funcionar bien:
$str = "this is a test string";
$new_str = preg_replace(''/string$/'', '''', $str);
Notas:
-
string
coinciden ... bueno ...string
- y
$
significa el final de la cadena
Para obtener más información, puede leer la sección de sintaxis de patrones del manual de PHP.
preg_replace y este patrón: / string / z / i
/ z significa el final de la cadena