2009-07-09 3 views
1

Pouvez-vous utiliser deux regex dans preg_replace pour faire correspondre et remplacer des éléments dans un tableau? Ainsi, par exemple:Remplacement d'éléments dans un tableau à l'aide de deux expressions régulières

Supposons que vous avez:

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] 
} 

et vous avez deux variables contenant des chaînes regex:

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

puis-je:

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

Pour remplacer "mailto: [email protected]" avec "[email protected]" dans chaque index de l'arra y.

+1

le 1 $ dans la réponse (s) ci-dessous se développer dans le 1er() sous-expression. Notez que nous avons ajouté (et) autour de la partie du match qui vous intéresse. – gahooa

+1

Le troisième paramètre de preg_match() peut être un tableau. Dans ce cas, preg_match() retournera un tableau. – gahooa

Répondre

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

EDIT: la solution de gahooa est probablement meilleure car elle déplace la boucle dans preg_replace.

+0

qu'est-ce que 1 $ représente? – Graham

+0

Le premier groupe correspondant. Dans ce cas, "([\ w -] + @ ([\ w -] + \.) + [\ W -] +)" correspond. –

1

Je pense que vous êtes à la recherche pour les groupes submatch '$ 1', comme d'autres ont déjà souligné. Mais pourquoi ne pouvez-vous faire exactement ce qui suit:

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

En fait, car votre regex ne permet pas l'utilisation de « : » importe où dans les adresses e-mail, vous pouvez le faire avec un str_replace() simple:

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

Pour ce type de substitution, vous devez utiliser str_replace il est Mutch plus rapide and strongly suggested by the online documentation:

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

Définitivement d'accord sur l'utilisation de 'str_replace' dans cette situation. C'est plus de deux fois plus rapide que l'expression rationnelle de gahooa. Pour l'anecdote, j'ai aussi essayé une boucle avec une construction 'substr ($ str, 7)'. C'est plus rapide que la regex, mais il ne bat pas 'str_replace'. – Geert

Questions connexes