2015-09-16 14 views
5

Ich versuche, eine Zeichenfolge exakt mit der Funktion preg_replace in PHP übereinzustimmen. Ich möchte nur Instanzen mit einem einzigen '@' Symbol übereinstimmen. Ich benötige auch eine Variable, die als Muster übergeben wird.Kann nicht übereinstimmen Exakte Zeichenfolge mit Preg_replace

$x = "@hello, @@hello, @hello, @@hello" 
$temp = '@hello' 

$x = preg_replace("/".$temp."/", "replaced", $x); 

sollte das Ergebnis sein gerade:

$x = "replaced, @@hello, replaced, @@hello" 

Vielen Dank im Voraus.

Antwort

4

hinzufügen eine negative look-behind(?<[email protected]), die eine Übereinstimmung fehlschlägt, wenn die $temp mit @ vorangestellt ist (oder, in einfachen Worten, wenn es eine @ vor @hello, passen sie nicht):

$x = "@hello, @@hello, @hello, @@hello"; 
$temp = '@hello'; 
$x = preg_replace("/(?<[email protected])".$temp."/", "replaced", $x); 
echo $x; 

See IDEONE demo

Und hier ist a regex demo

auch, wenn Sie am Ende ganze Wortgrenze haben, hängen \b bis zum Ende des Musters nur, um sicherzustellen, Sie nicht ersetzen:

"/(?<[email protected])".$temp."\\b/" 
+1

Arbeitet !! Vielen Dank! – sagnew

+0

Vergiss 'preg_quote()' auf '$ temp' nicht, wenn es dynamisch ist. – HamZa

Verwandte Themen