Me pregunto cómo podría eliminar todo después de cierta subcadena en PHP
ex:
Posted On April 6th By Some Dude
Me gustaría tenerlo para que elimine todo el texto, incluida, y después, la subcadena "Por"
Gracias
Me pregunto cómo podría eliminar todo después de cierta subcadena en PHP
ex:
Posted On April 6th By Some Dude
Me gustaría tenerlo para que elimine todo el texto, incluida, y después, la subcadena "Por"
Gracias
Respuestas:
$variable = substr($variable, 0, strpos($variable, "By"));
En inglés simple: dame la parte de la cadena que comienza en el principio y termina en la posición donde te encuentras con el deliminador.
Si está utilizando PHP 5.3+, eche un vistazo a la bandera $ before_needle de strstr ()
$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
FALSE
si no se encuentra una parte de la cadena. Entonces la solución podría ser:echo strstr($s, 'By', true) ?: $s;
explode(' By', $s)[0]
IMHO de squarecandy
¿Qué tal usar explode
:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
Ventajas:
$result[1]
volvería Some Dude
en este ejemplo)Podrías hacerlo:
$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;
Un método sería:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
By
, sino por cualquier carácter en el segundo parámetro. Es decir, se dividirá por cualquiera B
o y
. Técnicamente, no está obteniendo todo antes de a By
.
strtok('a:b', ':')
volverá a
pero strtok(':b', ':')
volverá b
, no una cadena vacía como cabría esperar.
Prueba esto.
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;
}
}
Uso:
<?php
//returns Apples
$clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>
La respuesta de Austin funciona para su caso de ejemplo.
En términos más generales, haría bien en examinar las funciones de expresión regular cuando la subcadena en la que se está dividiendo puede diferir entre cadenas:
$ variable = preg_replace ('/ By. * /', '', $ variable);
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
preg_replace
ofrece una forma:
$newText = preg_replace('/\bBy.*$/', '', $text);
Mediante el uso de expresiones regulares: $string = preg_replace('/\s+By.*$/', '', $string)
A continuación se muestra el método más eficiente (por tiempo de ejecución) para cortar todo después del primer By en una cadena. Si By no existe, se devuelve la cadena completa. El resultado está en $ 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"
Si no quiere ser sensible a mayúsculas y minúsculas, use stripos en lugar de strpos. Si cree que By podría existir más de una vez y desea cortar todo después de la última aparición, use strrpos .
A continuación se muestra un método menos eficiente, pero ocupa menos espacio en el código. Este método también es más flexible y le permite hacer cualquier expresión regular.
$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";
$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);
//$sResult = "Posted On April 6th"
Por ejemplo, si desea eliminar todo después del día:
$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"
Para mayúsculas y minúsculas, agregue el modificador i de esta manera:
$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);
Para que todo pase más allá del último Por si cree que puede haber más de uno, agregue un extra. * Al principio como este:
$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);
Pero aquí también hay una forma realmente poderosa de usar preg_match para hacer lo que intenta hacer:
$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
}
Las expresiones regulares pueden parecer confusas al principio, ¡pero pueden ser realmente poderosas y tu mejor amigo una vez que las domines! ¡Buena suerte!
Por qué...
Es probable que esto sea excesivo para las necesidades de la mayoría de las personas, pero aborda una serie de cosas que cada respuesta individual anterior no aborda. De los artículos que aborda, tres de ellos fueron necesarios para mis necesidades. Con un paréntesis apretado y dejando caer los comentarios, esto podría seguir siendo legible con solo 13 líneas de código.
Esto aborda lo siguiente:
Uso:
Envíe la cadena original, busque char / string, "R" / "L" para comenzar en el lado derecho o izquierdo, verdadero / falso para mayúsculas y minúsculas. Por ejemplo, busque "aquí" sin distinción entre mayúsculas y minúsculas, en cadena, comience por el lado derecho.
echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);
La salida sería "Ahora, aquí hay algunas palabras". Cambiar la "R" a una "L" generaría: "Ahora".
Aquí está la función:
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
}
}