2016-04-21 76 views
0

這是我的字符串:如何刪除字符串的最後部分?

monkey/rabbit/cat/donkey/duck 

如果我的變量是cat ...

$animal = cat 

...我想刪除一切cat後到來。

我期望的結果是:

monkey/rabbit/cat 

我試圖用str_replace

$subject = 'monkey/rabbit/cat/donkey/duck'; 
$trimmed = str_replace($animal, '', $subject); 
echo $trimmed; 

但在這裏我得到的結果是:

monkey/rabbit//donkey/duck 

所以它只是裁剪cat

+1

str_replaces *取代*一條繩子絆倒。嘗試使用strpos來獲取字符串的位置(即cat),然後substr獲取字符串的一部分 –

+0

@JustinJeong謝謝,我會測試它! – Jarla

+0

您可以使用爆炸並通過數組回顯新變量。即$ demosubj = exlpode($ animal,$ subject); echo $ demosubj [0]。$ animal;會得到你的 –

回答

1

您可以substr結合strpos

$pos = strpos($subject, $animal); 

if ($pos !== false) { 
    $result = substr($subject, 0, $pos + strlen($animal)); 
} 

如果您沃爾德想確保它只有充分段被刪除,在部分匹配的情況下,你可以使用的strpos offset參數:

$pos = strpos($subject, $animal); 

if ($pos !== false) { 
    $result = substr($subject, 0, strpos($subject, '/', $pos)); 
} 
+0

工作得很好! – Jarla

+0

非常感謝! – Jarla

+1

如果你在字符串中有* cat *和* polecat *,或者* dog *和* dogfish *,這實際上可能會失敗。 – CD001

1

你可以用你的情況explode

$string = "monkey/rabbit/cat/donkey/duck"; 
$val = explode("donkey", $string); 

echo $val[0]; 

Result: monkey/rabbit/cat 

PS * Ofcourse有更好的方法來做到這一點

1

這裏稍微解釋一下什麼每一步操作:

$subject = 'monkey/rabbit/cat/donkey/duck'; 

$target = 'cat'; 
$target_length = strlen($target);     // get the length of your target string 
$target_index = strpos($subject, $target);  // find the position of your target string 
$new_length = $target_index + $target_length;  // find the length of the new string 
$new_subject = substr($subject, 0, $new_length); // trim to the new length using substr 

echo $new_subject; 

這些都可以合併成一個聲明。

$new_subject = substr($subject, 0, strpos($subject, $target) + strlen($target)); 

這假設你的目標被找到。如果沒有找到目標,則目標將被修剪到目標的長度,這顯然不是你想要的。例如,如果您的目標字符串爲"fish",則新主題將爲"monk"。這就是爲什麼其他答案會檢查if ($pos !== false) {

對您的問題的評論之一提出了一個有效的觀點。如果您搜索恰好包含在其他字符串中的字符串,則可能會收到意想不到的結果。當使用substr/strpos方法時,確實沒有一種好方法來避免此問題。如果要確保只匹配分隔符(/)之間的整個單詞,則可以按/進行爆炸並在結果數組中搜索目標。

$subject = explode('/', $subject);     // convert to array 
$index = array_search($target, $subject);    // find the target 
if ($index !== false) {        // if it is found, 
    $subject = array_slice($subject, 0, $index + 1); // remove the end of the array after it 
} 
$new_subject = implode('/', $subject);    // convert back to string 
1

我的方法是用你的變量對explode
取第一部分並追加變量。

<?php 

$string = 'monkey/rabbit/cat/donkey/duck'; 

$animal = 'cat'; 

$temp = explode($animal,$string); 

print $temp[0] . $animal; 

將輸出很好

monkey/rabbit/cat 

沒有必要使用任何strposstrlensubstrdonkeys

1
<?php 
    $animal="cat"; 
    $string1="monkey/rabbit/cat/donkey/duck"; 
    $parts = explode($animal, $string1); 
    $res = $parts[0]; 
    print("$res$animal") 
?> 
1

我可能會到KOP一些高射炮下降RegExp路線但...

$subject = 'monkey/rabbit/polecat/cat/catfish/duck'; 
$animal = "cat"; 
echo preg_replace('~(.*(?:/|^)' . preg_quote($animal) . ')(?:/|$).*~i', "$1", $subject); 

這將確保您的動物立即在任一側包裹有/個字符,或者它位於字符串的開始或結尾(即, )。

因此,在這個例子中,它會輸出:

monkey/rabbit/polecat/cat 

具體結束,而不是在臭鼬鮎魚

+0

我認爲當正則表達式被用於過度殺傷的情況時,flak會發生。這似乎是對我的完全合理的應用。 –

相關問題