Eu só estou querendo saber como eu poderia remover tudo depois de uma certa substring em PHP
ex:
Posted On April 6th By Some Dude
Gostaria de tê-lo para que ele remova todo o texto, incluindo e depois a sub string "By"
obrigado
Eu só estou querendo saber como eu poderia remover tudo depois de uma certa substring em PHP
ex:
Posted On April 6th By Some Dude
Gostaria de tê-lo para que ele remova todo o texto, incluindo e depois a sub string "By"
obrigado
Respostas:
$variable = substr($variable, 0, strpos($variable, "By"));
Em inglês simples: dê-me a parte da sequência começando no início e terminando na posição em que você encontrou o deliminador pela primeira vez.
Se você estiver usando o PHP 5.3 ou superior, dê uma olhada no sinalizador $ before_needle de strstr ()
$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
FALSE
se parte da string não for encontrada. Portanto, a solução poderia ser:echo strstr($s, 'By', true) ?: $s;
explode(' By', $s)[0]
IMHO
Que tal usar explode
:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
Vantagens:
$result[1]
retornaria Some Dude
neste exemplo)Você poderia fazer:
$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;
Um método seria:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
By
, mas por qualquer caractere no segundo parâmetro. Ou seja, ele será dividido por um B
ou por um y
. Tecnicamente, não está recebendo tudo antes de um By
.
strtok('a:b', ':')
retornará, a
mas strtok(':b', ':')
retornará b
, não uma sequência vazia, como seria de esperar.
Tente isso.
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",",");
?>
A resposta de Austin funciona no seu caso de exemplo.
De uma maneira mais geral, seria bom examinar as funções de expressão regular quando a substring na qual você está dividindo pode diferir entre as strings:
$ variável = preg_replace ('/ Por. * /', '', $ variável);
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
preg_replace
oferece uma maneira:
$newText = preg_replace('/\bBy.*$/', '', $text);
Usando expressão regular: $string = preg_replace('/\s+By.*$/', '', $string)
Abaixo está o método mais eficiente (em tempo de execução) para cortar tudo após o primeiro By em uma string. Se By não existir, a cadeia completa será retornada. O resultado está em $ 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"
Se você não quer fazer distinção entre maiúsculas e minúsculas, use stripos em vez de strpos. Se você acha que By pode existir mais de uma vez e deseja cortar tudo após a última ocorrência, use strrpos .
Abaixo está um método menos eficiente, mas ocupa menos espaço de código. Esse método também é mais flexível e permite fazer qualquer expressão regular.
$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";
$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);
//$sResult = "Posted On April 6th"
Por exemplo, se você deseja remover tudo após o dia:
$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 não diferenciar maiúsculas de minúsculas, adicione o modificador i como este:
$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);
Para obter tudo após o último por se você acha que pode haver mais de um, adicionar um extra * no início como este.:
$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);
Mas aqui também é uma maneira realmente poderosa de usar preg_match para fazer o que você está tentando fazer:
$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
}
Expressões regulares podem parecer confusas no início, mas podem ser realmente poderosas e seu melhor amigo depois que você as dominar! Boa sorte!
Por quê...
Isso provavelmente é um exagero para as necessidades da maioria das pessoas, mas aborda várias coisas que cada resposta individual acima não aborda. Dos itens abordados, três deles foram necessários para minhas necessidades. Com bracketing apertado e eliminação dos comentários, isso ainda pode permanecer legível em apenas 13 linhas de código.
Isso aborda o seguinte:
Uso:
Envie a string original, pesquise char / string, "R" / "L" para iniciar no lado direito ou esquerdo, verdadeiro / falso para diferenciar maiúsculas e minúsculas. Por exemplo, procure por "aqui" sem distinção entre maiúsculas e minúsculas, na sequência, inicie o lado direito.
echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);
A saída seria "Agora, aqui estão algumas palavras". Alterar o "R" para um "L" produziria: "Agora".
Aqui está a função:
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
}
}
Use a função strstr .
<?php
$myString = "Posted On April 6th By Some Dude";
$result = strstr($myString, 'By', true);
echo $result ;
O terceiro parâmetro true
diz à função para retornar tudo antes da primeira ocorrência do segundo parâmetro.
strtok($str, 'By')
parece mais simples