2009-07-09 8 views
1

Können Sie in preg_replace zwei Regex verwenden, um Elemente in einem Array abzugleichen und zu ersetzen? So zum Beispiel:Ersetzen von Elementen in einem Array mithilfe von zwei regulären Ausdrücken

Angenommen, Sie haben:

Array 
(
    [0] => mailto:[email protected] 
    [1] => mailto:[email protected] 
    [2] => mailto:[email protected] 
    [3] => mailto:[email protected] 
    [4] => mailto:[email protected] 
    [5] => mailto:[email protected] 
    [6] => mailto:[email protected] 
} 

und Sie haben zwei Variablen regulären Ausdrücke halten:

$reg = '/mailto:[\w-][email protected]([\w-]+\.)+[\w-]+/i'; 
$replace = '/[\w-][email protected]([\w-]+\.)+[\w-]+/i'; 

kann ich:

preg_replace($reg,$replace,$matches); 

Um zu ersetzen "mailto: [email protected]" mit "[email protected]" in jedem Index des arra y.

+1

die $ 1 in der Antwort (en) unten in das erste expand() Unterausdruck. Beachten Sie, dass wir (und) den Teil des Matches hinzugefügt haben, an dem Sie interessiert sind. – gahooa

+1

Der dritte Parameter von preg_match() kann ein Array sein. In diesem Fall gibt preg_match() ein Array zurück. – gahooa

Antwort

1
foreach($array as $ind => $value) 
    $array[$ind] = preg_replace('/mailto:([\w-][email protected]([\w-]+\.)+[\w-]+)/i', '$1', $value); 

EDIT: gahooa Lösung ist wahrscheinlich besser, weil es die Schleife innerhalb preg_replace bewegt.

+0

Was bedeutet $ 1? – Graham

+0

Die erste passende Gruppe. In diesem Fall "([\ w -] + @ ([\ w -] +.) + [\ W -] +)" stimmt überein. –

1

Ich denke, dass Sie für die '$ 1' submatch Gruppen suchen, wie andere habe schon darauf hingewiesen. Aber warum können Sie nicht tun, nur folgende Möglichkeiten:

// strip 'mailto:' from the start of each array entry 
$newArray = preg_replace('/^mailto:\s*/i', '', $array); 

In der Tat, da Ihre regex erlauben nicht die Verwendung von ‚:‘ überall in den E-Mail-Adressen, können Sie es mit einem einfachen str_replace() tun könnte:

// remove 'mailto:' from each item 
$newArray = str_replace('mailto:', '', $array); 
1

Für diese Art der Substitution Sie str_replace verwenden sollte es mutch schneller and strongly suggested by the online documentation:

$array = str_replace('mailto:', '', $array); 
+0

Definiere definitiv die Verwendung von 'str_replace' in dieser Situation. Es ist mehr als doppelt so schnell wie Gahooas Regex. Für die Aufzeichnung habe ich auch eine Schleife mit einer 'substr ($ str, 7)' Konstruktion versucht. Es ist schneller als die Regex, schlägt aber 'str_replace' nicht. – Geert