Menu

preg_replace() w PHP: zamiana regex z odwołaniami wstecznymi

preg_replace($pattern, $replacement, $subject) zastępuje każde dopasowanie wyrażenia regularnego: preg_replace('/\s+/', ' ', $text) łączy białe znaki w jedną spację. Poznaj odwołania wsteczne, takie jak $1, preg_replace_callback, usuwanie znaków niealfanumerycznych, limity i liczniki.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

preg_replace($pattern, $replacement, $subject) znajduje w stringu każde dopasowanie wyrażenia regularnego i je zastępuje. preg_replace('/\s+/', ' ', $text) zamienia każdy ciąg spacji, tabulatorów i znaków nowej linii w jedną spację.

Oryginalny string się nie zmienia; preg_replace() zwraca nowy. \b oznacza granicę słowa, dlatego cats zostaje nietknięte.

Odwołania wsteczne: 1,1, {1} i \1

W zamienniku $1 oznacza to, do czego dopasowała się pierwsza grupa przechwytująca, $2 druga, a $0 całe dopasowanie. Używaj ich, aby przestawić dopasowany tekst.

Pisz zamiennik w pojedynczych cudzysłowach. W podwójnych "\1" staje się sekwencją ósemkową (bajtem 0x01), a "${1}" jest czytane jako zmienna o nazwie 1, która jest niezdefiniowana i używa składni stringów oznaczonej jako przestarzała od PHP 8.2. '\1' w pojedynczych cudzysłowach działa tak samo jak '$1', ale częściej spotyka się zapis $1.

Usuwanie znaków niealfanumerycznych

Zanegowana klasa znaków, [^...], pasuje do wszystkiego, czego nie wymieniono. Zamiana na '' usuwa to. Dla tekstu w innych językach użyj klas Unicode \p{L} (dowolna litera) i \p{N} (dowolna cyfra) z modyfikatorem u, inaczej usuniesz é, ü, polskie litery i każdy znak japoński.

Tworzenie sluga do adresu URL

Kilka wzorców po kolei zamienia tytuł w slug do adresu URL. Najpierw zamień na małe litery, potem każdy ciąg znaków niealfanumerycznych zamień na jeden łącznik, a na koniec usuń łączniki z obu końców:

Kilka wzorców, limit i licznik

$pattern i $replacement mogą być tablicami: każdy wzorzec jest zastępowany zamiennikiem o tym samym indeksie, po kolei. Czwarty argument ogranicza liczbę zamian na wzorzec (-1 oznacza brak limitu), a piąty dostaje liczbę wykonanych zamian.

Obliczanie zamiennika przez preg_replace_callback

Gdy zamiennik zależy od dopasowania, użyj preg_replace_callback(). Wywołuje twoją funkcję raz na każde dopasowanie z tablicą $matches i wstawia to, co funkcja zwróci. Funkcja strzałkowa mieści krótkie callbacki w jednej linii.

preg_replace_callback_array() przyjmuje tablicę par pattern => callback, gdy kilka wzorców potrzebuje każdy własnej funkcji.

Zamiennik ze zmiennej

$ albo ukośnik wsteczny w zamienniku mają znaczenie, więc zamiennik pochodzący od użytkownika lub z bazy danych może zostać zniekształcony. Cena $10 jest czytana jako odwołanie do grupy 10, która nie istnieje, i wychodzi pusta:

Gdy ani szukany tekst, ani zamiennik nie jest wzorcem, prostszym i szybszym wyborem jest str_replace(). Aby sprawdzić wzorzec przed zamianą czegokolwiek, zobacz preg_match().

Najczęściej zadawane pytania

Jak używać odwołań wstecznych w preg_replace?

W zamienniku odwołuj się do grup przechwytujących jako $1, $2 (albo \1): preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') zwraca "14/03/2026". Pisz zamiennik w pojedynczych cudzysłowach i używaj ${1}, gdy po odwołaniu następuje cyfra.

Jak usunąć wszystkie znaki niealfanumeryczne w PHP?

preg_replace('/[^a-zA-Z0-9]/', '', $s) zostawia tylko litery i cyfry ASCII. Aby zachować litery z każdego języka (é, ü, ą, 日本語), użyj klas Unicode z modyfikatorem u: preg_replace('/[^\p{L}\p{N}]/u', '', $s).

Czym różni się preg_replace od preg_replace_callback?

preg_replace() przyjmuje stały string zamiennika z miejscami $1. preg_replace_callback() wywołuje funkcję dla każdego dopasowania i używa wartości, którą ona zwróci, więc możesz obliczyć zamiennik: zamienić na wielkie litery, wykonać na nim obliczenia albo wyszukać go w tablicy.

Używać str_replace czy preg_replace?

Używaj str_replace(), gdy zamieniasz stały tekst: jest szybsze i nie wymaga escapowania. Używaj preg_replace(), gdy tekst do zamiany pasuje do wzorca, na przykład dowolny ciąg spacji, dowolna cyfra albo granica słowa.

Jak zamienić przez preg_replace tylko pierwsze dopasowanie?

Podaj limit jako czwarty argument: preg_replace('/\d+/', '#', 'a1 b2 c3', 1) zwraca "a# b2 c3". Piąty argument, przekazywany przez referencję, dostaje liczbę wykonanych zamian.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ