2016-07-14 2 views
1

Ich möchte prüfen, ob das vorangehende Zeichen eines search pattern ein alphanumerisches Zeichen ist.Wie überprüft man das Vorzeichen eines RegEx-Suchmusters mit PHP?

Wenn wahr, nichts tun.

Wenn fasle, entfernen Sie die vorhergehenden space in search pattern.

Zum Beispiel:

$string1 = "This is a test XYZ something else"; 

$string2 = "This is a test? XYZ something else"; 

$pattern = " XYZ"; 

In $ string1 Szenario, das vorhergehende Zeichen des Suchmusters ist t und als ein Spiel, nichts führen wird.

Im $ string2-Szenario ist das vorangehende Zeichen des Suchmusters ? und wird als nicht übereinstimmend betrachtet, und ich entferne den zusätzlichen Platz in searhc pattern.

Making it:

$string2 = "This is a test?XYZ something else"; 

Wie kann dies in PHP erreicht werden?

+0

Meinst du, das Muster sollte "XYZ" sein und kann nicht geändert werden? –

Antwort

4

können Sie verwenden, um ein \B XYZ Muster und verwenden Sie einen preg_replace_callback-trim den Wert Spiel und setzen Sie sie zurück:

$string1 = "This is a test XYZ something else"; 
$string2 = "This is a test? XYZ something else"; 
$pattern = " XYZ"; 
echo preg_replace_callback('~\B'.$pattern.'~', function($m) { return trim($m[0]); }, $string1) . PHP_EOL; 
// => This is a test XYZ something else 
echo preg_replace_callback('~\B'.$pattern.'~', function($m) { return trim($m[0]); }, $string2); 
// => This is a test?XYZ something else 

den See PHP demo

Seit \B Matches an den anderen Stellen als solche mit einem angepaßten Wortgrenze (eine Nicht-Wort-Grenze), das Muster wird nur nach einem Nicht-Wort-Zeichen übereinstimmen.

Weitere Details: Ihr Muster beginnt mit einem Leerzeichen. Dies ist ein Nicht-Wort-Zeichen. Durch das Hinzufügen von \B davor benötigen wir, dass das Zeichen vor dem Leerzeichen auch ein Nicht-Wort-Zeichen sein sollte. Sonst werden wir keine Übereinstimmung bekommen. Das Wort char ist ein Zeichensatz aus [a-zA-Z0-9_] Bereich. Wenn Sie die Begrenzung anpassen müssen, verwenden Sie einen Lookbehind wie (?<![a-zA-Z0-9]), um den Unterstrich von den Begrenzungszeichen auszuschließen.

Für weitere Informationen zu Nicht-Wortgrenze siehe this What are non-word boundary in regex (\B), compared to word-boundary? SO thread.

+1

Wenn Sie spezifischer als jede Nicht-Wort-Grenze sein müssen, könnten Sie einen Look-Behind verwenden, wie zum Beispiel '(? <= [A-zA-Z0-9]) –

+0

@ Wiktor-Stribiżew Die Lösung funktioniert, aber es fällt mir schwer, es zu verstehen. Der einzige Unterschied, den ich sehe, ist 'PHP_EOL' und wie hat es mit alphanumerischen Zeichen zu tun? – KDX

+0

@ Steven-Doggart Ihre vorgeschlagene Idee ist interessant, würde es Ihnen etwas ausmachen, es mit einer Beispielantwort zu erarbeiten? Es sieht so aus, als würde ich mehr Kontrolle darüber bekommen, was zu tun ist, und vielleicht besser zu meinem Projekt mit internationalen Sprachen passen. – KDX

Verwandte Themen