Если вы хотите заменить пробел на тире в 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.