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>