PHP

PHP замена пробела на тире в примерах

Если вы хотите заменить пробел на тире в PHP, то можно сделать это с помощью функции str_replace(). Обычно мы используем замену пробелов на тире для формирования URL-адреса из заданной строки, но иногда вам могут понадобиться пробелы для других целей.

В PHP функция str_replace() требует три аргумента: строку для поиска, строку для замены и строку, в которой происходит замена. Она заменяет все совпадения искомой строки (в предоставленной строке) на строку замены.

$title =  'How to replace space with dash in PHP';
$slug = str_replace(' ', '-', $title);
var_dump($slug);

// output: string(37) How-to-replace-space-with-dash-in-PHP

В приведенном выше примере все пробелы заменены тире.

Если вам нужно перевести строку в нижний регистр, то вы можете использовать функцию strtolower() следующим образом:

<?php
$title =  'How to replace space with dash in PHP';
$slug = str_replace(' ', '-', strtolower($title));
var_dump($slug);

// output: string(37) how-to-replace-space-with-dash-in-php

Если вы хотите преобразовать строку разделенную тире обратно в заголовок, то вы можете поменять местами значения замены и поиска:

<?php
$slug =  'how-to-replace-space-with-dash';
$title = str_replace('-', ' ', $slug);
var_dump($slug);

// output: string(37) how

Лучший способ замены пробела на тире в URL-фрагментах

Заменить пробел на тире в PHP можно быстро с помощью функции str_replace(). Однако если вам нужен больший контроль над результатом, например исключение буквенно-цифровых символов (например , (, ), $) или двойных тире, вам следует использовать регулярные выражения.

Чтобы использовать регулярные выражения, вам нужно использовать preg_match() вместо str_replace().

Например:

<?php
function makeSlug($title) {
    return preg_replace('![\s]+!u', '-', strtolower($title));
}

$slug = makeSlug('PHP replace space with dash');
var_dump($slug);

// output: string(27) php-replace-space-with-dash

Для тех, кто плохо знаком с регулярными выражениями два восклицательных знака (!) определяют начало и конец нашего регулярного выражения; Это могут быть любые символы, главное, чтобы они были одинаковыми. Буква u в конце означает поддержку символов Unicode.

!<EXPRESSION>!u

Этот вызов preg_replace() заменяет каждый пробел (\s) тире.

Пока что все работает так же, как с str_replace().

Давайте расширим функциональность, добавив к ней два других регулярных выражения. Одно из них исключает символы, отличные от дефисов, цифр и букв. А второе предназначено для удаления двойных тире, если они уже присутствуют в строке. 

<?php

function makeSlug($title) {
    $title = preg_replace('![\s]+!u', '-', strtolower($title));
    $title = preg_replace('![^-\pL\pN\s]+!u', '', $title);
    $title = preg_replace('![-\s]+!u', '-', $title);
    
    return trim($title, '-');
}

Заметьте, что мы также применяем функцию trim() для устранения дефисов в начале и конце строки.

Давайте проверим работу функции.

Для строк, содержащих символы, отличные от букв и цифр:

<?php

var_dump(makeSlug('PHP replace space with dash (with examples)'));
// output: string(41) php-replace-space-with-dash-with-examples

Для строки, в которой уже присутствует дефис:

<?php

var_dump(makeSlug(' Generate a URL-friendly slug '));
// output: string(28) generate-a-url-friendly-slug

Для строки с пробелами в начале и в конце:

<?php

var_dump(slug(' PHP is fun! '));
// output: string(10) php-is-fun

Этот удобный подход был вдохновлен методом Str::slug() из Laravel.

To top