отдельная строка пополам по заданной позиции - PullRequest
16 голосов
/ 10 августа 2010
$string = 'Some string';
$pos = 5;

...??...

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

Каков наилучший способ разделения строки на две по заданной позиции?

Ответы [ 8 ]

32 голосов
/ 10 августа 2010

Вы можете использовать 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);
20 голосов
/ 10 августа 2010

Решение Regex (если вы в него):

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

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

echo "$beg - $end";

С уважением

rbo

3 голосов
/ 10 августа 2010

Как насчет substr ()?

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

$beginning = substr($string, 0, $pos);
$end = substr($string, $pos);
1 голос
/ 18 апреля 2015

Я искал быстрый способ разбить строку в заданной позиции.

Почему данная должность? Обычно вам нужно разделить символ (я думаю, что вы искали по позиции, потому что функция разнесения разбила бы строку на слишком много частей):

Мое решение было наконец:

$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 и вообще не использует позицию.

Ссылка: Разделенная документация

1 голос
/ 10 августа 2010

Как лучше всего разделить строку пополам по заданной позиции?

Если я вас правильно понимаю, вы можете сделать:

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

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

Результат:

world

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

0 голосов
/ 20 сентября 2018
<?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
?>
0 голосов
/ 17 января 2018
<?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 (или символов ASCII, если не используется опция UTF-8, см. Ниже). Любое значение меньше 1 вернет всю входную строку как один фрагмент
  • $limit - максимальное количество или штук или 0 для неограниченного количества. Последняя часть будет содержать остаток строки и может быть длиннее или короче $length

Регулярное выражение, использующее магию, использует позитивный взгляд (?<= ... ). Он ищет ^, который является началом строки, | или, если он не находится в начале строки (?!^), он ищет \G, который является позицией предыдущего совпадения. . - любой символ, { n } повторяется n раз, где n равно {$length}. При использовании \G он по какой-то причине добавляет дополнительный символ, именно поэтому есть строка --$length; и почему первое совпадение имеет дополнительный . для поиска дополнительной кодовой точки, которая обычно не допускается в смотрите-зады. Я думаю, что утверждения нулевой ширины ^ и \G привязывают шаблон, допуская различную длину при просмотре.

Дополнительные { и } вокруг $length необходимы для предотвращения интерпретации регулярных выражений в качестве экранированной переменной PHP. /su - это параметры регулярного выражения. Опция /s позволяет . соответствовать символам новой строки. Опция /u указывает на совпадение кодовых точек Unicode, закодированных как UTF-8 (удалите u, если вы анализируете строки, не совместимые с UTF-8).

0 голосов
/ 19 ноября 2013

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...