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> 


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow