Разнесите строку на каждом втором символе точки

Как бы вы взорвали строку текста на каждом втором символе?

$text = "Online groceries is one of the few channels to market that is growing, though its profitability is questionable. According to industry research group IGD the UK online grocery market will nearly double to 18 billion pounds in the five years to 2020.Online groceries is one of the few channels to market that is growing, though its profitability is questionable. According to industry research group IGD the UK online grocery market will nearly double to 18 billion pounds in the five years to 2020.";

Чтобы взорваться на каждой точке, я бы использовал:

$domain_fragmented = explode(".", $text);

Есть ли способ сделать это, разбивая нить, или мне придется взорвать ее, а затем взорвать, чтобы получить желаемый эффект? Любые предложения, как это сделать?

Спасибо!

РЕДАКТИРОВАТЬ:

Я хочу разделить каждую вторую точку (.), А не любой второй символ.

2

Решение

Разнесите каждую точку, затем снова соедините пары элементов массива

$string = 'ab.cd.ef.gh.ij.kl.mn.op.qr';

$split = array_map(
function($value) {
return implode('.', $value);
},
array_chunk(explode('.', $string), 2)
);

var_dump($split);

демонстрация

2

Другие решения

я хотел бы использовать preg_split следующее:

$test = "this.is.a.test.to.see.how.preg_split.can.be.used.for.this";
$res = preg_split ("/(.*?\..*?)\./", $test, NULL,
PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($res);

Выход

Array (
[0] => this.is
[1] => a.test
[2] => to.see
[3] => how.preg_split
[4] => can.be
[5] => used.for
[6] => this
)

объяснение

Регулярное выражение, используемое здесь, захватывает текст до, включая вторую точку, и имеет группу захвата, которая исключает эту вторую точку. Указав PREG_SPLIT_DELIM_CAPTURE опция, все совпадения для этой захваченной группы включаются в результат.

Поскольку каждый символ в исходной строке каким-то образом будет частью выражения разбиения, остальные части, которые на самом деле являются нормальным результатом split, все пустые, за исключением, возможно, конечной части строки. С использованием PREG_SPLIT_NO_EMPTY Опция этих пустых строк исключается из результата.

Конечная часть строки не фиксируется регулярным выражением, потому что последняя точка будет отсутствовать. А как нормальный split Поведение добавляет эту часть в массив (будучи разделенной разделителем-разделителем), мы все равно получаем то, что нам нужно, также для конечной части строки.

NB: в моем первоначальном ответе я поставил \.|$ в конце регулярного выражения, с целью распознать эту последнюю часть строки также как разделитель, но с учетом вышесказанного в этом нет необходимости. Работает без |$ часть.

1

Как насчет использования pre_match_all?

/(?:(?:.+?\.){2})/

При этом вы получите список, содержащий два предложения (разделенных точкой) для каждого элемента списка.

$matches = null;
$returnValue = preg_match_all(
'/(?:(?:.+?\\.){2})/',
'
1_Online groceries is one of the few channels to market that is growing, though its profitability is questionable.
2_According to industry research group IGD the UK online grocery market will nearly double to 18 billion pounds in the five years to 2020.
3_Online groceries is one of the few channels to market that is growing, though its profitability is questionable.
4_According to industry research group IGD the UK online grocery market will nearly double to 18 billion pounds in the five years to 2020.',
$matches
);

Это возвращает следующее в $ match:

array (
0 => array (
0 => '1_Online groceries is one of the few channels to market that is growing, though its profitability is questionable. 2_According to industry research group IGD the UK online grocery market will nearly double to 18 billion pounds in the five years to 2020.',
1 => '3_Online groceries is one of the few channels to market that is growing, though its profitability is questionable. 4_According to industry research group IGD the UK online grocery market will nearly double to 18 billion pounds in the five years to 2020.',
)
)

К сожалению, это не идеально. Мне не удалось захватить какой-либо дополнительный текст, который болтается в конце входной строки (например, «assignce1.sentence2.bla»). Итак, если вы (или кто-то еще) не можете придумать улучшенное регулярное выражение, которое фиксирует это (то есть, если вам нужно, чтобы это было захвачено; если вы знаете, что входная строка всегда состоит из парных предложений, то все уже хорошо) Вы можете обрезать то, что захвачено с помощью pre_match_all. Остальное, следовательно, должно быть отдыхом 🙂

0
По вопросам рекламы [email protected]