Aktueller Standort: Startseite> Neueste Artikel> Wie verwende ich 1 $ 1 als Ersatz in der MB_eregi_Replace -Funktion von PHP, aber keine Gruppierung im Schema?

Wie verwende ich 1 $ 1 als Ersatz in der MB_eregi_Replace -Funktion von PHP, aber keine Gruppierung im Schema?

M66 2025-06-16

In PHP ist die Funktion mb_eregi_replace eine multibytensichere regelmäßige Ersatzfunktion, die die von Fall unempfindlichen regelmäßigen Expressionsersatz unterstützt. Die Verwendung ist ähnlich wie Eregi_Replace , ist jedoch für Multibyte -Saiten optimiert.


Problemhintergrund

Wenn Sie mb_eregi_replace zum Ersatz verwenden, möchte es in der Ersatzzeichenfolge $ 1 verwenden, um den Inhalt der ersten Erfassungsgruppe zu verweisen, z. B.:

 $pattern = 'pattern';
$replacement = '$1 something';
mb_eregi_replace($pattern, $replacement, $subject);

Wenn jedoch im regulären Expressionsmuster keine Gruppierung definiert ist (d. H. In Klammern eingeschlossen), hat 1 $ 1 keinen entsprechenden Inhalt, und 1 $ wird als normale Zeichenfolge angesehen und wird nicht durch einen übereinstimmenden Inhalt ersetzt.

Dies kann dazu führen, dass das Ersatzergebnis nicht erwartet wird.


Warum tritt dieses Problem auf?

Spezielle Symbole wie $ 1 und $ 2 werden verwendet, um den Inhalt der Erfassungsgruppe in einem regulären Ausdruck zu verweisen. Wenn der reguläre Ausdruck nicht mit Klammern gruppiert ist, sind diese Referenzen ungültig.

Zum Beispiel:

 $pattern = 'hello';
$replacement = '$1 world';
$subject = 'hello';

// Keine Gruppierung,$1 Kein entsprechender Inhalt
echo mb_eregi_replace($pattern, $replacement, $subject);

Das Ergebnis dieses Code ist:

 $1 world

Statt der imaginären:

 hello world

Lösung

Wenn Sie im Ersatzergebnis 1 US -Dollar verwenden möchten, müssen Sie sicherstellen, dass im regulären Ausdruck eine entsprechende Erfassungsgruppe vorhanden ist.

Lösung 1: Gruppen reguläre Ausdrücke Gruppen

Ändern Sie beispielsweise den Modus in:

 $pattern = '(hello)';
$replacement = '$1 world';
$subject = 'hello';

echo mb_eregi_replace($pattern, $replacement, $subject);

Das Ausgangsergebnis ist:

 hello world

Beachten:

  • Verwenden Sie Klammern, um den zu verwiesenen Teil zu wickeln, wodurch die Erfassungsgruppierung angezeigt wird.

  • $ 1 kann verwendet werden, auch wenn nur die gesamte passende Zeichenfolge erfasst wird.


Schema 2: Siehe die gesamte Matching -Zeichenfolge mit $ 0

In einigen regulären Ersatzfunktionen repräsentiert $ 0 die gesamte passende Zeichenfolge. Leider unterstützt MB_Eregi_Replace nicht 0 US -Dollar und kann sich nur auf 1 , $ 2 usw. in Gruppierungen beziehen.


Lösung 3: Verwenden Sie nicht $ 1 , ersetzen Sie es durch Rückrufe

Wenn es nicht bequem ist, das Muster zum Hinzufügen einer Gruppierung zu ändern, können Sie eine Ersatzfunktion verwenden, die stattdessen Rückruffunktionen unterstützt, z. B. mb_ereg_replace_callback , und dann die übereinstimmende Logik im Rückruf verarbeiten.

Beispiel:

 $pattern = 'hello';
$subject = 'hello';

$result = mb_ereg_replace_callback($pattern, function ($matches) {
    // $matches[0] Es ist das ganze Match
    return $matches[0] . ' world';
}, $subject);

echo $result;

Ausgabe:

 hello world

Zusammenfassen

  • MB_Eregi_Replace verwendet $ 1 und $ 2, um sich auf den Gruppierungsinhalt zu beziehen, und es ist erforderlich, sicherzustellen, dass die entsprechende Erfassungsgruppierung im regulären Ausdruck vorhanden ist.

  • Wenn es keine Gruppierung gibt, wird 1 US -Dollar nicht durch den passenden Inhalt ersetzt, sondern als normale Zeichenfolge behandelt.

  • Wenn Sie keine Gruppe hinzufügen möchten oder nicht, wird empfohlen, die Rückruffunktion zu verwenden, um einen komplexen Ersatz zu implementieren.


Referenzlink