_split_str_by_whitespace

The timeline below displays how wordpress function _split_str_by_whitespace has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.2

/**
 * Breaks a string into chunks by splitting at whitespace characters.
 *
 * The length of each returned chunk is as close to the specified length goal as possible,
 * with the caveat that each chunk includes its trailing delimiter.
 * Chunks longer than the goal are guaranteed to not have any inner whitespace.
 *
 * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.
 *
 * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)
 *
 *     _split_str_by_whitespace( "1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 ", 10 ) ==
 *     array (
 *         0 => '1234 67890 ',  // 11 characters: Perfect split.
 *         1 => '1234 ',        //  5 characters: '1234 67890a' was too long.
 *         2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long.
 *         3 => '1234   890 ',  // 11 characters: Perfect split.
 *         4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long.
 *         5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split.
 *         6 => '   45678   ',  // 11 characters: Perfect split.
 *         7 => '1 3 5 7 90 ',  // 11 characters: End of $text.
 *     );
 *
 * @since 3.4.0
 * @access private
 *
 * @param string $text   The string to split.
 * @param int    $goal   The desired chunk length.
 * @return array Numeric array of chunks.
 */
function _split_str_by_whitespace($text, $goal)
{
    $chunks = array();
    $string_nullspace = strtr($text, "\r\n\t\v\f ", "\x00\x00\x00\x00\x00\x00");
    while ($goal < strlen($string_nullspace)) {
        $pos = strrpos(substr($string_nullspace, 0, $goal + 1), "\x00");
        if (false === $pos) {
            $pos = strpos($string_nullspace, "\x00", $goal + 1);
            if (false === $pos) {
                break;
            }
        }
        $chunks[] = substr($text, 0, $pos + 1);
        $text = substr($text, $pos + 1);
        $string_nullspace = substr($string_nullspace, $pos + 1);
    }
    if ($text) {
        $chunks[] = $text;
    }
    return $chunks;
}

WordPress Version: 6.1

/**
 * Breaks a string into chunks by splitting at whitespace characters.
 *
 * The length of each returned chunk is as close to the specified length goal as possible,
 * with the caveat that each chunk includes its trailing delimiter.
 * Chunks longer than the goal are guaranteed to not have any inner whitespace.
 *
 * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.
 *
 * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)
 *
 *     _split_str_by_whitespace( "1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 ", 10 ) ==
 *     array (
 *         0 => '1234 67890 ',  // 11 characters: Perfect split.
 *         1 => '1234 ',        //  5 characters: '1234 67890a' was too long.
 *         2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long.
 *         3 => '1234   890 ',  // 11 characters: Perfect split.
 *         4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long.
 *         5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split.
 *         6 => '   45678   ',  // 11 characters: Perfect split.
 *         7 => '1 3 5 7 90 ',  // 11 characters: End of $string.
 *     );
 *
 * @since 3.4.0
 * @access private
 *
 * @param string $string The string to split.
 * @param int    $goal   The desired chunk length.
 * @return array Numeric array of chunks.
 */
function _split_str_by_whitespace($string, $goal)
{
    $chunks = array();
    $string_nullspace = strtr($string, "\r\n\t\v\f ", "\x00\x00\x00\x00\x00\x00");
    while ($goal < strlen($string_nullspace)) {
        $pos = strrpos(substr($string_nullspace, 0, $goal + 1), "\x00");
        if (false === $pos) {
            $pos = strpos($string_nullspace, "\x00", $goal + 1);
            if (false === $pos) {
                break;
            }
        }
        $chunks[] = substr($string, 0, $pos + 1);
        $string = substr($string, $pos + 1);
        $string_nullspace = substr($string_nullspace, $pos + 1);
    }
    if ($string) {
        $chunks[] = $string;
    }
    return $chunks;
}

WordPress Version: 5.4

/**
 * Breaks a string into chunks by splitting at whitespace characters.
 * The length of each returned chunk is as close to the specified length goal as possible,
 * with the caveat that each chunk includes its trailing delimiter.
 * Chunks longer than the goal are guaranteed to not have any inner whitespace.
 *
 * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.
 *
 * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)
 *
 *     _split_str_by_whitespace( "1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 ", 10 ) ==
 *     array (
 *         0 => '1234 67890 ',  // 11 characters: Perfect split.
 *         1 => '1234 ',        //  5 characters: '1234 67890a' was too long.
 *         2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long.
 *         3 => '1234   890 ',  // 11 characters: Perfect split.
 *         4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long.
 *         5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split.
 *         6 => '   45678   ',  // 11 characters: Perfect split.
 *         7 => '1 3 5 7 90 ',  // 11 characters: End of $string.
 *     );
 *
 * @since 3.4.0
 * @access private
 *
 * @param string $string The string to split.
 * @param int    $goal   The desired chunk length.
 * @return array Numeric array of chunks.
 */
function _split_str_by_whitespace($string, $goal)
{
    $chunks = array();
    $string_nullspace = strtr($string, "\r\n\t\v\f ", "\x00\x00\x00\x00\x00\x00");
    while ($goal < strlen($string_nullspace)) {
        $pos = strrpos(substr($string_nullspace, 0, $goal + 1), "\x00");
        if (false === $pos) {
            $pos = strpos($string_nullspace, "\x00", $goal + 1);
            if (false === $pos) {
                break;
            }
        }
        $chunks[] = substr($string, 0, $pos + 1);
        $string = substr($string, $pos + 1);
        $string_nullspace = substr($string_nullspace, $pos + 1);
    }
    if ($string) {
        $chunks[] = $string;
    }
    return $chunks;
}

WordPress Version: 4.3

/**
 * Breaks a string into chunks by splitting at whitespace characters.
 * The length of each returned chunk is as close to the specified length goal as possible,
 * with the caveat that each chunk includes its trailing delimiter.
 * Chunks longer than the goal are guaranteed to not have any inner whitespace.
 *
 * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.
 *
 * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)
 *
 *     _split_str_by_whitespace( "1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 ", 10 ) ==
 *     array (
 *         0 => '1234 67890 ',  // 11 characters: Perfect split
 *         1 => '1234 ',        //  5 characters: '1234 67890a' was too long
 *         2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long
 *         3 => '1234   890 ',  // 11 characters: Perfect split
 *         4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long
 *         5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split
 *         6 => '   45678   ',  // 11 characters: Perfect split
 *         7 => '1 3 5 7 90 ',  // 11 characters: End of $string
 *     );
 *
 * @since 3.4.0
 * @access private
 *
 * @param string $string The string to split.
 * @param int    $goal   The desired chunk length.
 * @return array Numeric array of chunks.
 */
function _split_str_by_whitespace($string, $goal)
{
    $chunks = array();
    $string_nullspace = strtr($string, "\r\n\t\v\f ", "\x00\x00\x00\x00\x00\x00");
    while ($goal < strlen($string_nullspace)) {
        $pos = strrpos(substr($string_nullspace, 0, $goal + 1), "\x00");
        if (false === $pos) {
            $pos = strpos($string_nullspace, "\x00", $goal + 1);
            if (false === $pos) {
                break;
            }
        }
        $chunks[] = substr($string, 0, $pos + 1);
        $string = substr($string, $pos + 1);
        $string_nullspace = substr($string_nullspace, $pos + 1);
    }
    if ($string) {
        $chunks[] = $string;
    }
    return $chunks;
}

WordPress Version: 4.1

/**
 * Breaks a string into chunks by splitting at whitespace characters.
 * The length of each returned chunk is as close to the specified length goal as possible,
 * with the caveat that each chunk includes its trailing delimiter.
 * Chunks longer than the goal are guaranteed to not have any inner whitespace.
 *
 * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.
 *
 * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)
 *
 *     _split_str_by_whitespace( "1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 ", 10 ) ==
 *     array (
 *         0 => '1234 67890 ',  // 11 characters: Perfect split
 *         1 => '1234 ',        //  5 characters: '1234 67890a' was too long
 *         2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long
 *         3 => '1234   890 ',  // 11 characters: Perfect split
 *         4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long
 *         5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split
 *         6 => '   45678   ',  // 11 characters: Perfect split
 *         7 => '1 3 5 7 90 ',  // 11 characters: End of $string
 *     );
 *
 * @since 3.4.0
 * @access private
 *
 * @param string $string The string to split.
 * @param int $goal The desired chunk length.
 * @return array Numeric array of chunks.
 */
function _split_str_by_whitespace($string, $goal)
{
    $chunks = array();
    $string_nullspace = strtr($string, "\r\n\t\v\f ", "\x00\x00\x00\x00\x00\x00");
    while ($goal < strlen($string_nullspace)) {
        $pos = strrpos(substr($string_nullspace, 0, $goal + 1), "\x00");
        if (false === $pos) {
            $pos = strpos($string_nullspace, "\x00", $goal + 1);
            if (false === $pos) {
                break;
            }
        }
        $chunks[] = substr($string, 0, $pos + 1);
        $string = substr($string, $pos + 1);
        $string_nullspace = substr($string_nullspace, $pos + 1);
    }
    if ($string) {
        $chunks[] = $string;
    }
    return $chunks;
}

WordPress Version: 3.7

/**
 * Breaks a string into chunks by splitting at whitespace characters.
 * The length of each returned chunk is as close to the specified length goal as possible,
 * with the caveat that each chunk includes its trailing delimiter.
 * Chunks longer than the goal are guaranteed to not have any inner whitespace.
 *
 * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.
 *
 * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)
 *
 * <code>
 * _split_str_by_whitespace( "1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 ", 10 ) ==
 * array (
 *   0 => '1234 67890 ',  // 11 characters: Perfect split
 *   1 => '1234 ',        //  5 characters: '1234 67890a' was too long
 *   2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long
 *   3 => '1234   890 ',  // 11 characters: Perfect split
 *   4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long
 *   5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split
 *   6 => '   45678   ',  // 11 characters: Perfect split
 *   7 => '1 3 5 7 9',    //  9 characters: End of $string
 * );
 * </code>
 *
 * @since 3.4.0
 * @access private
 *
 * @param string $string The string to split.
 * @param int $goal The desired chunk length.
 * @return array Numeric array of chunks.
 */
function _split_str_by_whitespace($string, $goal)
{
    $chunks = array();
    $string_nullspace = strtr($string, "\r\n\t\v\f ", "\x00\x00\x00\x00\x00\x00");
    while ($goal < strlen($string_nullspace)) {
        $pos = strrpos(substr($string_nullspace, 0, $goal + 1), "\x00");
        if (false === $pos) {
            $pos = strpos($string_nullspace, "\x00", $goal + 1);
            if (false === $pos) {
                break;
            }
        }
        $chunks[] = substr($string, 0, $pos + 1);
        $string = substr($string, $pos + 1);
        $string_nullspace = substr($string_nullspace, $pos + 1);
    }
    if ($string) {
        $chunks[] = $string;
    }
    return $chunks;
}