разбить строку, используя два разделителя и l oop через результат - PullRequest
2 голосов
/ 07 января 2020

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

У меня есть строка, которая может содержать несколько пар разделителей, вставленных в разные позиции в строке, например:

Быстрый [начало] бурый лис [конец] перепрыгивает через [начало] ленивый [конец] собака.

или

[начало] Быстрый коричневый [конец] лиса перепрыгивает через [начало] ленивый [конец] собака.

Что мне нужно: каждый раз, когда я нахожу эти разделители, я хочу отображать содержимое с разделителями в двух столбцах в pdf, но также сохранять оставшуюся часть строки до и после этих разделителей.

Исходя из первого примера, приведенного выше, мне нужно получить следующий результат:

The quick
$mpdf->SetColumns(2); 
brown fox
$mpdf->SetColumns(0);
jumps over 
$mpdf->SetColumns(2);
the lazy
$mpdf->SetColumns(0);
dog

Это функция, которую я использую с php. net, но, как вы можете вижу, что это работает только для одной пары разделителей, я не знаю, как использовать foreach здесь, а также сохранить нужный мне формат:

    function multiexplode ($delimiters,$string) {
    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
}

$exploded = multiexplode(array('[begin]','[end]'),$mystring);

//if delimiters exist, then split in two columns only those parts of the string
if (count($exploded) > 1) {

//begining of the string
$mpdf->WriteHTML($exploded[0]);

//split in two columns
$mpdf->SetColumns(2);
$mpdf->WriteHTML($exploded[1]);

//reset to single column and write the rest of the string
$mpdf->SetColumns(0);
$mpdf->WriteHTML($exploded[2]);

} else {
//set two columns for the entire string
$mpdf->SetColumns(2);
$mpdf->WriteHTML($mystring);
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Я думаю, что нашел способ решить мою просьбу. Прокрутив вниз до той же страницы на php. net, я нашел эту функцию доступной:

function multiexplode ($delimiters,$string) {
$ary = explode($delimiters[0],$string);
array_shift($delimiters);
if($delimiters != NULL) {
    foreach($ary as $key => $val) {
         $ary[$key] = multiexplode($delimiters, $val);
    }
}
return  $ary;

}

Использование этой функции и подсказки от Эндрю (спасибо!) Моего кода выглядит вот так:

            $exploded = multiexplode(array('[begin]','[end]'),$mystring);

        //if delimiters exist, then split in two columns only those parts of the string
        if (count($exploded) > 1) {

        //slice the array from begining
        foreach(array_slice($exploded,0) as $key=>$explode) {
            //show the first slice of the array
            if ($key == 0) {
            $mpdf->SetColumns(0);
            $mpdf->WriteHTML($explode[0]);
            //get the rest of sliced array and set it to 2 columns
            }   else if ($key > 0) {
            $mpdf->SetColumns(2);
            $mpdf->WriteHTML($explode[0]);
            //if delimiters [end], then reset columns to 0 and continue with the rest of the sliced array
            $mpdf->SetColumns(0);
            $mpdf->WriteHTML($explode[1]);
            }
        }

        } else {
        //set 2 columns to entire string
        $mpdf->SetColumns(2);
        $mpdf->WriteHTML($mystring);
        }

Я уверен, что есть и другие лучшие варианты, поэтому, пожалуйста, не стесняйтесь добавлять свой код. Спасибо. enter image description here

0 голосов
/ 07 января 2020

Выезд preg_split. Это похоже на взрыв, но вы можете использовать регулярное выражение в качестве разделителя.

https://www.php.net/manual/en/function.preg-split.php

Вот пример, используя либо [начало] или [конец] в качестве разделителя: https://3v4l.org/nlC9K

Код:

$string = 'The quick [begin]brown fox[end] jumps over [begin]the lazy[end] dog.';

$array = preg_split('/\\[begin\\]|\\[end\\]/', $string, -1);

print_r($array);

Вывод:

Array
(
    [0] => The quick 
    [1] => brown fox
    [2] =>  jumps over 
    [3] => the lazy
    [4] =>  dog.
)

Вы можете удалить лишние пробелы с помощью trim .

ОБНОВЛЕНИЕ: Код на основе вашего примера:

$exploded = preg_split('/\\[begin\\]|\\[end\\]/', $mystring, -1);

// Iterate through the array
foreach($exploded as $key => $string) {
    $mpdf->WriteHTML(trim($string));
    if($key++ % 2 == 0) {
        // Every 2nd one
        $mpdf->SetColumns(0);
    } else {
        // Every odd one
        $mpdf->SetColumns(2);
    }
}

Опять же, я не уверен, чего должны достичь SetColumns - может быть, вам нужно обрабатывать его по-разному, если в массиве только один элемент, возможно, вам нужен дополнительный, чтобы закрыть его после последнего. Но это должно быть хорошим началом.

...