PHP
Wyrażenia regularne (regexp / PCRE)
Szukaj…
Składnia
-
preg_replace($pattern, $replacement, $subject, $limit = -1, $count = 0);
-
preg_replace_callback($pattern, $callback, $subject, $limit = -1, $count = 0);
-
preg_match($pattern, $subject, &$matches, $flags = 0, $offset = 0);
-
preg_match_all($pattern, $subject, &$matches, $flags = PREG_PATTERN_ORDER, $offset = 0);
-
preg_split($pattern, $subject, $limit = -1, $flags = 0)
Parametry
Parametr | Detale |
---|---|
$pattern | ciąg z wyrażeniem regularnym (wzór PCRE) |
Uwagi
Wyrażenia regularne PHP są zgodne ze standardami wzorcowymi PCRE, które pochodzą z wyrażeń regularnych Perla.
Wszystkie ciągi PCRE w PHP muszą być otoczone ogranicznikami. Separator może być dowolnym nie alfanumerycznym znakiem, bez odwrotnego ukośnika i spacją. Popularnymi ogranicznikami są na przykład ~
, /
, %
.
Wzorce PCRE mogą zawierać grupy, klasy postaci, grupy postaci, asercje dotyczące przyszłości / azylu i znaki ucieczki.
Możliwe jest użycie modyfikatorów PCRE w ciągu $pattern
. Niektóre z nich to i
(bez rozróżniania wielkości liter), m
(wielowierszowy) i s
(metaznak kropki obejmuje znaki nowej linii). Modyfikator g
(globalny) jest niedozwolony, zamiast tego użyjesz funkcji preg_match_all
.
Dopasowania do ciągów znaków PCRE są wykonywane za pomocą ciągów numerowanych z prefiksem $
:
<?php
$replaced = preg_replace('%hello ([a-z]+) world%', 'goodbye $1 world', 'hello awesome world');
echo $replaced; // 'goodbye awesome world'
Dopasowywanie ciągów z wyrażeniami regularnymi
preg_match
sprawdza, czy łańcuch pasuje do wyrażenia regularnego.
$string = 'This is a string which contains numbers: 12345';
$isMatched = preg_match('%^[a-zA-Z]+: [0-9]+$%', $string);
var_dump($isMatched); // bool(true)
Jeśli przekażesz trzeci parametr, zostanie on wypełniony pasującymi danymi wyrażenia regularnego:
preg_match('%^([a-zA-Z]+): ([0-9]+)$%', 'This is a string which contains numbers: 12345', $matches);
// $matches now contains results of the regular expression matches in an array.
echo json_encode($matches); // ["numbers: 12345", "numbers", "12345"]
$matches
zawiera tablicę całego dopasowania, a następnie podłańcuchy w wyrażeniu regularnym ograniczonym nawiasami, w kolejności odsunięcia otwartego nawiasu. Oznacza to, że jeśli masz /z(a(b))/
jako wyrażenie regularne, indeks 0 zawiera cały podłańcuch zab
, indeks 1 zawiera substrat ograniczony zewnętrznymi nawiasami ab
a indeks 2 zawiera wewnętrzne nawiasy b
.
Podziel ciąg na tablicę za pomocą wyrażenia regularnego
$string = "0| PHP 1| CSS 2| HTML 3| AJAX 4| JSON";
//[0-9]: Any single character in the range 0 to 9
// + : One or more of 0 to 9
$array = preg_split("/[0-9]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
//Or
// [] : Character class
// \d : Any digit
// + : One or more of Any digit
$array = preg_split("/[\d]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
Wynik:
Array
(
[0] => PHP
[1] => CSS
[2] => HTML
[3] => AJAX
[4] => JSON
)
Aby podzielić ciąg na tablicę, wystarczy przekazać ciąg i preg_split();
dla preg_split();
aby dopasować i wyszukać, dodanie trzeciego parametru ( limit
) pozwala ustawić liczbę „dopasowań” do wykonania, pozostały ciąg zostanie dodany na końcu tablicy.
Czwarty parametr to ( flags
), w tym przypadku używamy PREG_SPLIT_NO_EMPTY
który zapobiega PREG_SPLIT_NO_EMPTY
przez naszą tablicę pustych kluczy / wartości.
Ciąg zastępujący wyrażenie regularne
$string = "a;b;c\nd;e;f";
// $1, $2 and $3 represent the first, second and third capturing groups
echo preg_replace("(^([^;]+);([^;]+);([^;]+)$)m", "$3;$2;$1", $string);
Wyjścia
c;b;a
f;e;d
Wyszukuje wszystko między średnikami i odwraca kolejność.
Globalne dopasowanie RegExp
Globalne dopasowanie RegExp można wykonać za pomocą preg_match_all
. preg_match_all
zwraca wszystkie pasujące wyniki w ciągu tematu (w przeciwieństwie do preg_match
, który zwraca tylko pierwszy).
Funkcja preg_match_all
zwraca liczbę dopasowań. Dopasowania trzeciego parametru $matches
będą zawierać dopasowania w formacie kontrolowanym przez flagi, które można podać w czwartym parametrze.
Jeśli podana zostanie tablica, $matches
będą zawierały tablicę w podobnym formacie, który otrzyma się z preg_match
, z tym wyjątkiem, że preg_match
zatrzymuje się przy pierwszym dopasowaniu, gdzie preg_match_all
iteruje się po ciągu, aż łańcuch zostanie całkowicie zużyty i zwraca wynik każdej iteracji w tablicy wielowymiarowej , który format może być kontrolowany przez flagę w czwartym argumencie.
Czwarty argument, $flags
, steruje strukturą tablicy $matches
. Domyślnym trybem jest PREG_PATTERN_ORDER
a możliwe flagi to PREG_SET_ORDER
i PREG_PATTERN_ORDER
.
Poniższy kod demonstruje użycie preg_match_all
:
$subject = "a1b c2d3e f4g";
$pattern = '/[a-z]([0-9])[a-z]/';
var_dump(preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)); // int(3)
var_dump($matches);
preg_match_all($pattern, $subject, $matches); // the flag is PREG_PATTERN_ORDER by default
var_dump($matches);
// And for reference, same regexp run through preg_match()
preg_match($pattern, $subject, $matches);
var_dump($matches);
Pierwszy PREG_SET_ORDER
z PREG_SET_ORDER
daje ten wynik:
array(3) {
[0]=>
array(2) {
[0]=>
string(3) "a1b"
[1]=>
string(1) "1"
}
[1]=>
array(2) {
[0]=>
string(3) "c2d"
[1]=>
string(1) "2"
}
[2]=>
array(2) {
[0]=>
string(3) "f4g"
[1]=>
string(1) "4"
}
}
$matches
ma trzy zagnieżdżone tablice. Każda tablica reprezentuje jedno dopasowanie, które ma ten sam format co wynik zwracany przez preg_match
.
Drugi PREG_PATTERN_ORDER
( PREG_PATTERN_ORDER
) daje następujące dane wyjściowe:
array(2) {
[0]=>
array(3) {
[0]=>
string(3) "a1b"
[1]=>
string(3) "c2d"
[2]=>
string(3) "f4g"
}
[1]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "4"
}
}
Po uruchomieniu tego samego wyrażenia regularnego przez preg_match
zwracana jest następująca tablica:
array(2) {
[0] =>
string(3) "a1b"
[1] =>
string(1) "1"
}
Ciąg zamień na wywołanie zwrotne
preg_replace_callback
działa, wysyłając każdą dopasowaną grupę przechwytującą do zdefiniowanego wywołania zwrotnego i zastępuje ją zwracaną wartością wywołania zwrotnego. To pozwala nam zamieniać łańcuchy oparte na dowolnej logice.
$subject = "He said 123abc, I said 456efg, then she said 789hij";
$regex = "/\b(\d+)\w+/";
// This function replaces the matched entries conditionally
// depending upon the first character of the capturing group
function regex_replace($matches){
switch($matches[1][0]){
case '7':
$replacement = "<b>{$matches[0]}</b>";
break;
default:
$replacement = "<i>{$matches[0]}</i>";
}
return $replacement;
}
$replaced_str = preg_replace_callback($regex, "regex_replace", $subject);
print_r($replaced_str);
# He said <i>123abc</i>, I said <i>456efg</i>, then she said <b>789hij</b>