Использование chop и explode для извлечения строки из пути к файлу, но в массиве результатов не выводится буква «n» - PullRequest
2 голосов
/ 21 мая 2019

Я использую explode(), чтобы извлечь строку ($style) из имен файлов шрифтов в определенном каталоге, а затем распечатать некоторые стили на основе полученного массива.Результаты будут усечены, если строка содержит букву n .

Сервер работает под управлением Ubuntu Bionic PHP7.3 .После того, как оператор if (in_array()) не смог перехватить строку, я добавил оператор print_r() для отладки.Именно тогда я увидел, что буква n действует как граница и обрезает вывод.

Все имена шрифтов принимают формат $family - $style -webfont.woff (или .woff2), например, merriweather-bold-webfont.woff.

Пример кода:

function my_fontload() {
    // Locate font files
    $font_path = get_stylesheet_directory_uri() . "/path/to/fonts/";
    $files = glob(get_stylesheet_directory( __FILE__ ) . '/path/to/fonts/*.woff', GLOB_BRACE);

    $suffix = '-webfont';
      foreach($files as &$file) {

        $font = basename($file, ".woff");
        $font = chop($font,$suffix);

        $family = explode("-", $font);
        $family = $family[0];

        $style = explode("-", $font);


        echo '@font-face{font-family:\''.$family.'\';src:url('. esc_url(( $font_path).basename($file)).'2)format(\'woff2\'),url('.esc_url(( $font_path).basename($file)).')format(\'woff\');';
        if (in_array('thin', $style) || in_array( 'hairline', $style)) {
            // Do stuff
        } elseif (in_array('regular', $style) || in_array( 'normal', $style)) {
           // Do other stuff
        } else {
            // Do default stuff
        }
        // Other logic here

        // debugging
        print_r($style);
    }

    unset ($file);
}

Ожидаемый результат:


(
    [0] => merriweather
    [1] => regular
)

(
    [0] => merriweather
    [1] => thin
)

(
    [0] => merriweather
    [1] => hairline
)

Фактический результат:


(
    [0] => merriweather
    [1] => regular
)

(
    [0] => merriweather
    [1] => thi
)

(
    [0] => merriweather
    [1] => hairli
)

Это как если бы n трактуется как некий литерал, как символ новой строки или что-то в этом роде.Что происходит?

1 Ответ

2 голосов
/ 21 мая 2019

Прежде всего, я рекомендую изменить синтаксис на:

list($family, $style) = explode('-', $font, 2);

Как кажется, вы хотите сравнить только стиль. Тогда вам не нужен in_array, но вы можете просто использовать оператор if.

К вашей проблеме обрезки: как вы можете видеть в документации chop , второй аргумент говорит, какие буквы удалить с правой стороны строки - вы указываете буквы: -,w,e,b,f,o,n,t поэтому начинаем с самой правильной буквы - если она является одной из тех, которые он обрезал - когда сталкиваюсь с первой буквой, которой нет остановки ->

Для этого вы получите thi вместо thin, как удалить n, но не i. И hairli вместо hairline и оба n и e находятся в письмах -,w,e,b,f,o,n,t, но не i.

Живой пример: 3v4l .

Если все, что вы хотите (и я думаю, это то, что вы хотите), это удалить суффикс:

substr($fonf, 0, - strlen('-webfont'));

Отредактировано:

Это пример для вашего кода:

$files = ['merriweather-regular-webfont.woff','merriweather-thin-webfont.woff','merriweather-hairline-webfont.woff'];
foreach($files as $file) {
    $font = basename($file, ".woff"); // remove the file type
    $font = str_replace('-webfont', '', $font); // remove the suffix
    list($family, $style) = explode('-', $font, 2); // explode for 2 parts: family and style
    echo "Family: $family and style: $style" . PHP_EOL; 
    if (in_array($style, ['thin', 'hairline'])) {
        echo esc_html('font-weight:100;font-style:normal;'); 
    } elseif (in_array($style, ['regular', 'normal'])) {
       echo esc_html('font-weight:400;font-style:normal;');
    } else {
        echo esc_html('font-weight:400;font-style:normal;'); // Fallback 
    }
}
...