在给定位置将两个字符串分开

时间:2010-08-10 13:19:10

标签: php string

$string = 'Some string';
$pos = 5;

...??...

$begging // == 'Some s';
$end // == 'tring';

将给定位置的字符串分成两个字符串的最佳方法是什么?

8 个答案:

答案 0 :(得分:30)

您可以使用substr获取两个子字符串:

$str1 = substr($str, 0, $pos);
$str2 = substr($str, $pos);

如果省略第三个参数 length substr将取其余的字符串。

但要获得结果,您实际上需要在$pos中添加一个:

$string = 'Some string';
$pos = 5;
$begin = substr($string, 0, $pos+1);
$end = substr($string, $pos+1);

答案 1 :(得分:19)

正则表达式解决方案(如果你参与其中):

...
$string = 'Some string xxx xxx';
$pos = 5;

list($beg, $end) = preg_split('/(?<=.{'.$pos.'})/', $string, 2);

echo "$beg - $end";

此致

RBO

答案 2 :(得分:3)

substr()怎么样?

$string = 'Some string';
$pos = 5;

$beginning = substr($string, 0, $pos);
$end = substr($string, $pos);

答案 3 :(得分:1)

  

分开的最佳方式是什么?   给定位置的字符串是什么?

如果我理解正确,你可以这样做:

$str = 'hello world';
$pos = 5;

$separated_str = substr($str, $pos);
echo $separated_str;

<强>结果:

world

这取决于字符串的结构,因为还有其他方法可以拆分字符串。

答案 4 :(得分:1)

我正在寻找一种快速的方法来分割给定位置的字符串。

为什么给定位置?通常你需要的是对一个角色进行分割(我认为你是按位置搜索的,因为爆炸函数会将字符串分成太多块):

我的解决方案终于来了:

$string = "hello world my dear";
list ($first, $remaining ) = split (' ', $string, 2); //limit to 2 pieces
echo $first; //"hello";
echo $remaining; //"world my dear";

请注意,我放弃使用“position”(我使用“substr”来获取它)。

鉴于您对“位置”的需求并非真正必要,我的解决方案是上述所有其他解决方案中最快的,并且没有多字节问题。此外,我认为阅读起来要容易得多。

不幸的是,在上一个PHP中不推荐使用该函数,如果你有旧的PHP,你可以使用它,或者你可以使用preg_split。我对此并不是很满意,因为实现相同功能的唯一方法是滥用正则表达式。如果你不能使用split,最快的选择是:

$string = "hello world my dear";
list ($first, $remaining ) =  preg_split('/\s+/', $string, 2);

比@rubber答案要快得多,根本不使用位置。

参考: Split documentation

答案 5 :(得分:0)

Wordwrap在我看来效果更好。

$text = "The quick brown fox jumped over the lazy dog.";
$newtext = wordwrap($text, 20, "<br />\n");
echo $newtext;

以上示例将输出:

The quick brown fox<br />
jumped over the lazy<br />
dog.

另一个例子:

$text = "A very long woooooooooooord.";
$newtext = wordwrap($text, 8, "\n", true);

echo "$newtext\n";

以上示例将输出:

A very
long
wooooooo
ooooord.

答案 6 :(得分:0)

<?php
$string = 'Some string';
$pos = 6;
$number_of_pieces = 2;
list($beginning, $end) = split_into_pieces($string, $pos, $number_of_pieces);
// $beginning === 'Some s'; $end === 'tring'

function split_into_pieces($string, $length, $limit = 0) {
  --$length;
  return preg_split("/(?<=^..{{$length}}|(?!^)\\G.{{$length}})/", $text, $limit);
}
  • $string是要拆分的字符串
  • $length是Unicode代码点中每个部分的大小(如果不使用UTF-8选项,则为ASCII字符,见下文)。任何小于1的值都会将整个输入字符串作为单个部分返回
  • $limit是最大数量或数量,或0无限制。最后一块将包含字符串的其余部分,可能比$length
  • 更长或更短

正在进行魔术的正则表达式是使用正面的后视(?<= ... )。它会查找^,它是字符串|的开头,或者如果它不在字符串(?!^)的开头,它会查找\G,这是前一场比赛的位置。 .是任何字符,{ n }重复 n 次,其中 n 为{ {1}}。使用{$length}时,由于某种原因,它会添加额外的字符,这就是为什么第\G行和为什么第一个匹配额外--$length;来搜索额外字符的原因代码点,通常不允许在后视镜中使用。我认为零宽度断言.^正在锚定模式,允许在后视中使用不同的长度。

围绕\G的额外{}是必要的,以阻止正则表达式括号被解释为转义的PHP变量。 $length是正则表达式选项。 /su选项表示允许/s匹配换行符。 .选项表示匹配编码为UTF-8的Unicode代码点(如果要解析非UTF-8兼容的字符串,请删除/u。)

答案 7 :(得分:0)

<?php
Function Splp($S,...$A){ #Split At Positions 
    $k = 0;
    $R = [];
    $A[] = Strlen($S);
    Foreach($A As $a){
        $R[] = Substr($S,$k,$a-$k);
        $k = $a;
    }
    Return $R;}

$string = 'Some string';
$pos1 = 5;
$pos2 = 7;
[$Start,$Mid,$End] = Splp($string,$pos1,$pos2);
echo $Start,', ',$Mid,', ',$End; #  Some , st, ring
?>