2010-04-06 2 views
86

Я просто интересно, как я мог бы удалить все после определенной подстроки в PHPУдалить часть строки после определенного символа

например:

Posted On April 6th By Some Dude 

Я хотел бы иметь его так, чтобы она удаляет весь текст, включая и после того, как, к югу строки «по»

Благодаря

+0

Что делать, если вспомогательная строка выполняется дважды (или больше)? –

+12

Как примечание, если вы делаете это, вы можете взять чужой контент и представить его на своем собственном сайте **, не **. – ceejayoz

+0

Я согласен с ceejayoz. Это очень похоже на то, что вы пытаетесь использовать контент, на который у вас действительно нет доступа, и вы пытаетесь удалить любую ссылку на оригинального автора. Это было бы не очень хорошо ... – selfawaresoup

ответ

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

В равнинных Engl ish: Дайте мне часть строки, начиная с начала и заканчивая в том месте, где вы впервые сталкиваетесь с разделителем.

+6

Как насчет «только сделать это, если» по «существует?» – Alisso

+3

Вы правы. Strpos вернет FALSE, если «By» не найден. Substr вернет пустую строку, если указанная длина равна false. На практике это, вероятно, будет полезно, чтобы проверить, существует ли «By», а затем делает это только в том случае, если это так (0). –

+7

Это работает: strpos ($ variable, «By»)? substr ($ variable, 0, strpos ($ переменная «By»)): $ variable; – Goahnary

14

Вы можете сделать:

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

Regex кажется излишним здесь ... – thetaiko

+0

+1, чистый и сладкий – user187291

+3

+1 Это единственный, который работает, если управляющие символы НЕ присутствуют (в отличие от других, которые возвращают пустую строку, если контрольные символы не присутствуют в исходной строке) –

3
$var = "Posted On April 6th By Some Dude"; 
$new_var = substr($var, 0, strpos($var, " By")); 
5

ответ Остин работает на вашем примере дела.

В целом, вы не мешало бы заглянуть в regular expression functions когда подстрока вы разделив может меняться в зависимости от строки:

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

+1 Это правильно. Если вы хотите также разделить на «Author:» или «Written By:» Или «Используется с согласия:», было бы легче всего сделать регулярное выражение. Однако, когда я не выполняю логики регулярных выражений, я стараюсь избегать их, поскольку они, кажется, сразу добавляют уровень сложности в код (по крайней мере, для меня) –

78

Если вы используете PHP 5.3+ взглянуть на за $ before_needle флаг strstr()

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

Спасибо, это правильный правильный ответ _nowadays_! – Matmarbon

+38

Обратите внимание, что он вернет 'FALSE', если часть строки не найдена. Таким образом, решение может быть следующим: 'echo strstr ($ s, 'By', true)?: $ S;' – kenorb

+1

^^^ Ответ kenorb должен быть принятым ответом сегодня. другой альтернативой будет «взрыв» («By», $ s) «квадрат» [0] 'IMHO –

2

используя регулярное выражение: $string = preg_replace('/\s+By.*$/', '', $string)

16

Как об использовании explode:

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

Преимущества:

  • Очень считываемых/внятные
  • Возвращает полный строку, если разделитель строка ("К" в данном примере) не присутствует. (Не будет возвращать FALSE, как некоторые другие ответы.)
  • Не требует регулярного выражения.
  • делает вторую часть строки слишком доступны, если вам это нужно ($result[1] бы вернуться Some Dude в этом примере)
+0

Это старомодный – bkac

+0

@bkac - Что случилось со старомодным, пока оно работает и не обесценивается? – squarecandy

+3

Это исключает дополнительную проверку наличия строки разделителя, требуемой принятым ответом. –

1

Вы можете использовать list и explode функции:

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

Один метод должен был бы:

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

Это лучший ответ, который он работает, даже если By не находится в строке, ответ substr неверен, потому что doest'nt существует, он терпит неудачу. – neoteknic

4

Попробуйте это.

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; 
     } 
    } 

Использование:

<?php 
    //returns Apples 
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",","); 
?> 
+0

Вам было бы намного лучше называть функцию strip_after_string вместо sas и иметь базу кода, полную загадочных инициализмов. Это мой любимый самый читаемый ответ на этот вопрос. – Anther

0

Используйте функцию strstr.

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

echo $result ; 

Третий параметр true говорит функции вернуть все до первого появления второго параметра.

+0

'strtok ($ str, 'By')' выглядит проще – mu3

0

Ниже приведен самый эффективный метод (по времени выполнения), чтобы отрезать все после первого К в строке. Если К не существует, возвращается полная строка. Результат - $ 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" 

Если вы не хотите быть чувствительны к регистру, используйте stripos вместо StrPos. Если вы думаете К может существовать более одного раза и хотите вырезать все после последнего вхождения, используйте strrpos.

Ниже приведен менее эффективный метод, но он занимает меньше пространства кода. Этот метод также более гибкий и позволяет вам выполнять любое регулярное выражение.

$sInputString = "Posted On April 6th By Some Dude"; 
$pControl = "By"; 

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

//$sResult = "Posted On April 6th" 

Например, если вы хотите, чтобы удалить все после дня:

$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" 

Для случая нечувствительного, добавьте модификатор я так:

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

Чтобы получить все мимо last К если вы считаете, что может быть более одного, добавьте дополнительно.* В начале, как это:

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

Но здесь также является очень мощным способом вы можете использовать preg_match, чтобы делать то, что вы, возможно, пытается сделать:

$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 
} 

Регулярные выражения могут показаться запутанным на первом но они могут быть действительно мощными и вашим лучшим другом, как только вы овладеете ими! Удачи!

Смежные вопросы