2013-03-06 109 views
0

我有一個字符串,它是未知長度和字符。x個字符後截斷字符串

我希望能夠在x個字符後截斷字符串。

例如來自:

$string = "Hello# m#y name # is Ala#n Colem#n" 
$character = "#" 
$x = 4 

我想回:

"Hello# m#y name # is Ala#" 

希望我沒有在這裏複雜的事情!

非常感謝

+0

你的意思是,在本例中的問題,一切都交給的「#」 4日發生? – AD7six 2013-03-06 17:40:23

+0

這是正確的,我想必須有一個PHP函數,這意味着我不必循環? – Boomfelled 2013-03-06 17:42:21

+0

用'strtok'構建一個新字符串的循環看起來效率最高。當然,你可以使用'$ arr = explode($ character,$ string,$ x + 1); $ newstring = implode('#',array_slice($ arr,0,4))''route。 – Wrikken 2013-03-06 17:42:56

回答

4
function posncut($input, $delim, $x) { 
    $p = 0; 
    for($i = 0; $i < $x; ++ $i) { 
     $p = strpos($input, $delim, $p); 
     if($p === false) { 
      return ""; 
     } 
     ++ $p; 
    } 
    return substr($input, 0, $p); 
} 
echo posncut($string, $character, $x); 

它發現依次在每個分隔符(strpos)和你要找的人後停止。如果第一個文本用完(strpos返回false),它會給出一個空字符串。

更新:這是我製作的一個基準,它將此方法與爆炸進行比較:http://codepad.org/rxTt79PC。似乎explode(當與array_pop而不是array_slice一起使用時)更快。

+0

不是「我的」 - 感謝基準+1只是爲了提供它(應在您的答案中引用它)。很難通過外觀來判斷代碼,而且這樣做往往是錯誤的=) – AD7six 2013-03-06 18:28:57

+0

添加了它,並清理了上面的註釋線程,因爲它看起來像我在跟自己說話:P – Dave 2013-03-06 18:47:15

4

我建議explode-在#上的字符串,然後獲取該數組中的前4個元素。

$string = "Hello# m#y name # is Ala#n Colem#n"; 
$character = "#"; 
$x = 4; 

$split = explode($character, $string); 
$split = array_slice($split, 0, $x); 

$newString = implode($character, $split).'#'; 
1

這些方針的東西:

$str_length = strlen($string) 
$character = "#" 
$target_count = 4 

$count = 0; 
for ($i = 0 ; $i<$str_length ; $i++){ 
    if ($string[$i] == $character) { 
     $count++ 
     if($count == $target_count) break; 
    } 

} 

$result = sub_str($string,0,$i)