2013-03-06 270 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)