Разделить большую строку в массив, но точка разделения не может разбить тег - PullRequest
3 голосов
/ 21 июля 2010

Я написал скрипт, который отправляет куски текста в Google для перевода, но иногда текст, который является исходным кодом html), в конечном итоге разбивается на середину тега html, и Google возвращает неверный код. *

Я уже знаю, как разбить строку на массив, но есть ли лучший способ сделать это, при условии, что выходная строка не превышает 5000 символов и не разделяется на тег?

ОБНОВЛЕНИЕ: Благодаря ответу, этот код я использовал в своем проекте, и он прекрасно работает

function handleTextHtmlSplit($text, $maxSize) {
    //our collection array
    $niceHtml[] = '';

    // Splits on tags, but also includes each tag as an item in the result
    $pieces = preg_split('/(<[^>]*>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

    //the current position of the index
    $currentPiece = 0;

    //start assembling a group until it gets to max size

    foreach ($pieces as $piece) {
        //make sure string length of this piece will not exceed max size when inserted
        if (strlen($niceHtml[$currentPiece] . $piece) > $maxSize) {
            //advance current piece
            //will put overflow into next group
            $currentPiece += 1;
            //create empty string as value for next piece in the index
            $niceHtml[$currentPiece] = '';
        }
        //insert piece into our master array
        $niceHtml[$currentPiece] .= $piece;
    }

    //return array of nicely handled html
    return $niceHtml;
}

Ответы [ 3 ]

3 голосов
/ 21 июля 2010

Примечание: у меня не было возможности проверить это (поэтому может быть небольшая ошибка или два), но это должно дать вам представление:

function get_groups_of_5000_or_less($input_string) {

    // Splits on tags, but also includes each tag as an item in the result
    $pieces = preg_split('/(<[^>]*>)/', $input_string,
        -1, PREG_SPLIT_DELIM_CAPTURE);

    $groups[] = '';
    $current_group = 0;

    while ($cur_piece = array_shift($pieces)) {
        $piecelen = strlen($cur_piece);

        if(strlen($groups[$current_group]) + $piecelen > 5000) {
            // Adding the next piece whole would go over the limit,
            // figure out what to do.
            if($cur_piece[0] == '<') {
                // Tag goes over the limit, just put it into a new group
                $groups[++$current_group] = $cur_piece;
            } else {
                // Non-tag goes over the limit, split it and put the
                // remainder back on the list of un-grabbed pieces
                $grab_amount = 5000 - $strlen($groups[$current_group];
                $groups[$current_group] .= substr($cur_piece, 0, $grab_amount);
                $groups[++$current_group] = '';
                array_unshift($pieces, substr($cur_piece, $grab_amount));
            }
        } else {
            // Adding this piece doesn't go over the limit, so just add it
            $groups[$current_group] .= $cur_piece;
        }
    }
    return $groups;
}

Также обратите внимание, что это может разбитьсясередина обычных слов - если вы не хотите этого, измените часть, которая начинается с // Non-tag goes over the limit, чтобы выбрать лучшее значение для $grab_amount.Я не стал его кодировать, так как это всего лишь пример того, как обойти разделение тегов, а не выпадающее решение.

0 голосов
/ 21 июля 2010

preg_split с хорошим регулярным выражением сделает это за вас.

0 голосов
/ 21 июля 2010

Почему бы не убрать html-теги из строки перед отправкой в ​​Google. В PHP есть функция strip_tags () , которая может сделать это за вас.

...