2010-04-06 21 views
86

me pregunto cómo podría eliminar todo después de un cierto subcadena en PHPRetire parte de una cadena después de un cierto carácter

ejemplo:

Posted On April 6th By Some Dude 

me gustaría tenerlo de manera que que elimina todo el texto incluyendo, y después, la cadena sub "Por"

Gracias

+0

¿Qué sucede si la cadena secundaria ocurre dos veces (o más)? –

+12

Como nota, si está haciendo esto para poder tomar el contenido de otra persona y presentarlo en su propio sitio, ** no **. – ceejayoz

+0

Estoy de acuerdo con ceejayoz. Esto se parece mucho a que está intentando usar contenido al que no tiene acceso realmente y está tratando de eliminar cualquier referencia al autor original. Eso no sería muy bueno ... – selfawaresoup

Respuesta

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

En Engl llanura ish: Dame la parte de la cadena que comienza al principio y termina en la posición en la que encuentras el deliminador por primera vez.

+6

¿Qué pasa con "solo haz esto si" por "existe? – Alisso

+3

Tienes razón. Strpos devolverá FALSO si no se encuentra" Por ". Substr devolverá una cadena vacía si la longitud dada es falsa. En la práctica, probablemente sería útil para comprobar si existe "Por" y luego solo hacer esto si lo hace (de lo contrario, simplemente dejando la cadena sola). –

+7

Esto funciona: strpos ($ variable, "Por")? substr ($ variable, 0, strpos ($ variable, "By")): $ variable; – Goahnary

14

que podría hacer:

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

Regex parece exagerado aquí ... – thetaiko

+0

+1, limpio y dulce – user187291

+3

+1 Es el único que funciona si los caracteres de control NO están presentes (a diferencia de los otros que devuelven una cadena vacía si los caracteres de control no están presentes en la cadena de origen) –

1

preg_replace ofrece una manera:

$newText = preg_replace('/\bBy.*$/', '', $text); 
3
$var = "Posted On April 6th By Some Dude"; 
$new_var = substr($var, 0, strpos($var, " By")); 
5

respuesta de Austin trabaja para su caso de ejemplo.

De manera más general, que haría bien en mirar en el regular expression functions cuando la subcadena está dividiendo en espera puede variar entre las cuerdas:

 
$variable = preg_replace('/By.*/', '', $variable); 
+0

+1, esto es correcto. Si desea dividir también en "Autor:" o "Escrito por:" O "Usado con el consentimiento de:" probablemente sería más fácil hacer una expresión regular. Sin embargo, cuando no hago ninguna lógica regex, tiendo a evitarlos ya que parecen agregar inmediatamente un nivel de complejidad al código (al menos para mí) –

78

Si estás usando PHP 5.3+ echar un vistazo a la bandera $ before_needle de strstr()

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

¡Gracias, esta es la respuesta correcta actual _nowadays_! – Matmarbon

+38

Tenga en cuenta que devolverá 'FALSE' si no se encuentra una porción de cadena. Entonces, la solución podría ser: 'echo strstr ($ s, 'By', true)?: $ S;' – kenorb

+1

^^^ La respuesta de kenorb debería ser hoy la respuesta aceptada. otra alternativa sería 'explotar ('By', $ s) [0]' IMHO –

2

mediante el uso de expresiones regulares: $string = preg_replace('/\s+By.*$/', '', $string)

16

¿Y si uso explode:

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

Ventajas:

+0

Está pasado de moda – bkac

+0

@bkac - ¿Qué pasa con la antigua siempre que funcione y no se deprecie? – squarecandy

+3

Esto elimina la comprobación adicional de la existencia de la cadena delimitadora requerida por la respuesta aceptada. –

1

Usted puede utilizar list y explode funciones:

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

Un método sería:

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

Esta es la mejor respuesta que funciona incluso si By no está en la cadena, la respuesta del substr es incorrecta porque es por que no existe, falla. – neoteknic

4

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

Sería mucho mejor nombrar la función strip_after_string en lugar de sas y tener una base de código llena de iniciales crípticas. Sin embargo, esta es mi respuesta favorita más legible a esta pregunta. – Anther

0

utilizar la función strstr.

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

echo $result ; 

El tercer parámetro true cuenta la función para devolver todo antes de la primera aparición del segundo parámetro.

+0

'strtok ($ str, 'By')' parece más simple – mu3

0

A continuación se muestra el método más eficiente (por tiempo de ejecución) para cortar todo después del primer por en una cadena. Si Por no existe, se devuelve la cadena completa. El resultado es 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 estar entre mayúsculas y minúsculas, utilice stripos en lugar de strpos. Si cree que Por pueden existir más de una vez y desea cortar todo después de la última ocurrencia, 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 el caso insensible, añadir el modificador i como esto:

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

para tener todo más allá de la último Por si cree que puede haber más de uno, agregue un extra.* Al principio de esta manera:

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

Pero aquí es también una manera muy poderosa que puede utilizar preg_match para hacer lo que puede estar tratando de 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 confuso al principio ¡pero pueden ser realmente poderosos y tu mejor amigo una vez que los domines! ¡Buena suerte!

Cuestiones relacionadas