2011-01-17 11 views

Antwort

3

Wenn Sie die .NET-Regex-Engine zu Ihrer Verfügung hätten, könnten Sie dies in einem einzigen Regex tun, indem Sie nach (?:.(?=\[email protected])|(?<[email protected]\S+).) suchen und alle Übereinstimmungen durch dot ersetzen.

In PHP, würden Sie es in zwei Schritten zu tun haben/iterativ:

Suche nach \.(?=\[email protected]) und ersetzen mit dot:

$subject = preg_replace('/\.(?=\[email protected])/', ' dot ', $subject); 

Dadurch werden alle Punkte, die in E-Mail-Adressen ersetzen, bevor auftreten die @. Dann nach (@\S+)\. suchen und durch \1 dot ersetzen; Wiederholen Sie dies, bis keine weiteren Übereinstimmungen gefunden werden.

So etwas wie

while (preg_match('/(@\S+)\./', $subject)) { 
    $subject = preg_replace('/(@\S+)\./', '\1 dot ', $subject); 
} 

Dies wird innerhalb einer E-Mail-Adresse nach den @, einen Punkt passen, aber da PHP Regex-Engine, ich brauche nicht unendlich Lookbehind unterstützt die Regex auf den String so oft erneut anwenden als die maximale Anzahl von Punkten nach dem @. In der Zeichenkette @foo.bar.com wird zum Beispiel zuerst @foo.bar. angezeigt und durch @foo.bar dot ersetzt. Dann wird im nächsten Lauf @foo. durch @foo dot ersetzt.