Regulärer Ausdruck: Suchergebnis in PHP-Funktion weiterverarbeiten

27apricot

Erfahrenes Mitglied
Hallo,

ich suche eine Möglichkeit, bei der Suche nach einem regulären Ausdruck das Suchergebnis durch eine PHP-Funktion verarbeiten zu lassen.

Konkret: ich benutze die Funktion preg_replace($suchen, $ersetzen, $text);, wobei die zwei Variablen $suchen und $ersetzen jeweils ein Array sind.

Nun suche ich im Text nach Email-Adressen mithilfe des folgenden Ausdruckes: '~([a-zA_Z0-9_\.\-]+@[a-zA_Z0-9_\.\-]+)~'
Jetzt kann ich im $ersetzen-Array die gefundene Adresse verarbeiten mit '<a href="mailto:\1">\1</a>'

Bis dahin funktioniert alles. Nun möchte ich die Adresse aber weiterverarbeiten mit einer Funktion, die sie gegen Spam maskiert und dabei wiederum verschiedene PHP-Funktionen durchläuft.

Gibt es also eine Möglichkeit, den Ausdruck '\1' in einer Funktion weiterzuverarbeiten?

Vielen Dank schonmal im Voraus!
Grüße: 27apricot.
 
Hallo und vielen Dank,

hat prima funktioniert. Hier das komplette Ergebnis, mit dem eine Email-Adresse in einem Text durch einen gegen Spam maskierten Email-Link ersetzt wird:
PHP:
function no_spam($mail) {
    $str = "";
    $a = unpack("C*", $mail);
    foreach ($a as $b)
      $str .= sprintf("%%%X", $b);
    return "mailto:".$str;
}
function email_link($regex) {
	return "<a href=\"".no_spam($regex[1])."\">".str_replace("@", "[at]", substr_replace($regex[1], "[.]", strrpos($regex[1], "."), 1))."</a>";
}
function email_ersetzen($text) {
	return preg_replace_callback('~([a-zA_Z0-9_\.\-]+@[a-zA_Z0-9_\.\-]+)~', 'email_link', $text);
}

Aus vor.name_nach-name@domain.de wird damit
<a href="mailto:%76%6F%72%2E%6E%61%6D%65%5F%6E%61%63%68%2D%6E%61%6D%65%40%64%6F%6D%61%69%6E%2E%64%65">vor.name_nach-name[at]domain[.]de</a>

Schöne Grüße:
27apricot
 
Ha, noch ein Stück einfacher:

PHP:
function no_spam($mail) {
    $str = "";
    $a = unpack("C*", $mail);
    foreach ($a as $b)
      $str .= sprintf("%%%X", $b);
    return "mailto:".$str;
}
function email_link($mail) {
	return "<a href=\"".no_spam($mail)."\">".str_replace("@", "[at]", substr_replace($mail, "[.]", strrpos($mail, "."), 1))."</a>";
}

$text_neu = preg_replace(
	'~([a-zA_Z0-9_\.\-]+@[a-zA_Z0-9_\.\-]+)~e',
	'email_link("\1")',
	$text
);

Durch den Modifier "e" hinter dem regulären Ausdruck kann ich die Spam-Schutz-Funktion email_link(), die ich auch sonst benutze, direkt in preg_replace() anwenden. Mit der anderen Lösung Beispiel musste ich sie vorher nochmal unter anderem Namen aufschreiben, um den Regulären Ausdruck einzubauen.

Schöne Grüße
27apricot.
 
Zurück