PHP
Reguläre Ausdrücke (Regex / PCRE)
Suche…
Syntax
-
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)
Parameter
Parameter | Einzelheiten |
---|---|
$pattern | eine Zeichenfolge mit einem regulären Ausdruck (PCRE-Muster) |
Bemerkungen
Regelmäßige PHP-Ausdrücke folgen den PCRE-Musterstandards, die von regulären Perl-Ausdrücken abgeleitet werden.
Alle PCRE-Zeichenfolgen in PHP müssen mit Trennzeichen eingeschlossen werden. Ein Trennzeichen kann ein beliebiges nicht alphanumerisches Zeichen, kein Backslash und kein Whitespace-Zeichen sein. Beliebte Trennzeichen sind beispielsweise ~
, /
, %
.
PCRE-Muster können Gruppen, Zeichenklassen, Zeichengruppen, Look-Ahead- / Look-Behind-Assertions und Escape-Zeichen enthalten.
Es ist möglich, PCRE-Modifikatoren in der $pattern
Zeichenfolge zu verwenden. Einige gebräuchliche sind i
(ohne Berücksichtigung der Groß- und Kleinschreibung), m
(mehrzeilig) und s
(das Punkt-Metazeichen schließt Zeilenumbrüche ein). Der Modifizierer g
(global) ist nicht zulässig, stattdessen wird die Funktion preg_match_all
verwendet.
Übereinstimmungen mit PCRE-Zeichenfolgen werden mit $
vorangestellten nummerierten Zeichenfolgen ausgeführt:
<?php
$replaced = preg_replace('%hello ([a-z]+) world%', 'goodbye $1 world', 'hello awesome world');
echo $replaced; // 'goodbye awesome world'
String-Abgleich mit regulären Ausdrücken
preg_match
prüft, ob eine Zeichenfolge mit dem regulären Ausdruck übereinstimmt.
$string = 'This is a string which contains numbers: 12345';
$isMatched = preg_match('%^[a-zA-Z]+: [0-9]+$%', $string);
var_dump($isMatched); // bool(true)
Wenn Sie einen dritten Parameter übergeben, wird er mit den übereinstimmenden Daten des regulären Ausdrucks gefüllt:
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
enthält ein Array der gesamten Übereinstimmung und dann Teilstrings im regulären Ausdruck, die durch Klammern in der Reihenfolge der Versetzung der offenen Klammer begrenzt sind. Das heißt, wenn Sie /z(a(b))/
als regulären Ausdruck haben, enthält Index 0 die gesamte zab
, Index 1 enthält die zab
, die durch die äußeren Klammern ab
und Index 2 enthält die inneren Klammern b
.
Zeichenfolge durch einen regulären Ausdruck in ein Array aufteilen
$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);
Ausgabe:
Array
(
[0] => PHP
[1] => CSS
[2] => HTML
[3] => AJAX
[4] => JSON
)
Um einen String in ein Array aufzuteilen, preg_split();
einfach den String und einen Regex für preg_split();
Wenn Sie einen dritten Parameter ( limit
) hinzufügen und suchen möchten, können Sie die Anzahl der durchzuführenden Übereinstimmungen festlegen. Der verbleibende String wird am Ende des Arrays hinzugefügt.
Der vierte Parameter ist ( flags
) hier verwenden wir die PREG_SPLIT_NO_EMPTY
, die von enthält alle leeren Schlüssel / Werte unser Angebot verhindert.
Zeichenfolge, die durch regulären Ausdruck ersetzt wird
$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);
Ausgänge
c;b;a
f;e;d
Sucht alles zwischen Semikolons und kehrt die Reihenfolge um.
Globales RegExp-Match
Eine globale RegExp-Übereinstimmung kann mit preg_match_all
durchgeführt werden. preg_match_all
gibt alle übereinstimmenden Ergebnisse in der Betreffzeichenfolge zurück (im Gegensatz zu preg_match
, das nur das erste Ergebnis zurückgibt).
Die Funktion preg_match_all
gibt die Anzahl der Übereinstimmungen zurück. Der dritte Parameter $matches
enthält Übereinstimmungen im Format, das durch Flags gesteuert wird, die im vierten Parameter angegeben werden können.
Wenn ein Array angegeben wird, enthält $matches
ein Array mit einem ähnlichen Format, das Sie mit preg_match
würden, mit der preg_match
, dass preg_match
bei der ersten Übereinstimmung stoppt. preg_match
preg_match_all
den String so lange, bis der String vollständig verbraucht ist und das Ergebnis jeder Iteration in einem mehrdimensionalen Array zurückgibt , welches Format durch das Flag im vierten Argument gesteuert werden kann.
Das vierte Argument, $flags
, steuert die Struktur des Arrays $matches
. Der Standardmodus ist PREG_PATTERN_ORDER
und mögliche Flags sind PREG_SET_ORDER
und PREG_PATTERN_ORDER
.
Der folgende Code demonstriert die Verwendung von 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);
Der erste var_dump von PREG_SET_ORDER
liefert diese Ausgabe:
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
hat drei verschachtelte Arrays. Jedes Array stellt eine Übereinstimmung dar, die dasselbe Format wie das Ergebnis von preg_match
.
Der zweite var_dump ( PREG_PATTERN_ORDER
) liefert diese Ausgabe:
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"
}
}
Wenn derselbe reguläre Ausdruck durch preg_match
, wird das folgende Array zurückgegeben:
array(2) {
[0] =>
string(3) "a1b"
[1] =>
string(1) "1"
}
String durch Callback ersetzen
preg_replace_callback
sendet jede übereinstimmende Erfassungsgruppe an den definierten Callback und ersetzt sie durch den Rückgabewert des Callbacks. Dies ermöglicht uns, Zeichenfolgen basierend auf jeder Art von Logik zu ersetzen.
$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>