2010-09-23 6 views
2

J'ai développé un plugin wordpress qui regarde à travers un tas de html et détecte toute adresse e-mail, en les remplaçant par un balisage html non récupérable (à être recompté comme un email via javascript pour meilleure convivialité).Expression régulière: remplacer l'adresse e-mail, avec une torsion

Ainsi, par exemple, la fonction reçoit:

$content = "Hello [email protected] How are you today?"; 

et sorties:

$content = "Hello <span class="email">john(replace this parenthesis by @)example.com</span>. How are you today?"; 

fonctionne Ma fonction bien, mais je voudrais maintenant donner une option pour spécifier ce que l'e-mail lisible devrait être comme. Donc, si la fonction reçoit:

$content = "Hello [email protected](John Doe). How are you today?"; 

la nouvelle sortie serait:

$content = "Hello <span class="email" title="John Doe">john(replace this parenthesis by @)example.com</span>. How are you today?"; 

Ainsi, le regex devrait chercher parenthèse attachée, et si trouvé, prendre ce qui est à l'intérieur et ajouter un attribut title html, supprimer la parenthèse, puis analyser le courrier électronique. Je n'ai pas la moindre idée de la façon de le réaliser, en raison de la nature optionnelle de la fonctionnalité (ce qui veut dire que ces parenthèses ne seront pas toujours présentes).

Tout pointeur serait utile, voici mon code actuel:

function pep_replace_excerpt($content) { 
    $addr_pattern = '/([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})/i'; 
     preg_match_all($addr_pattern, $content, $addresses); 
     $the_addrs = $addresses[0]; 
     for ($a = 0; $a < count($the_addrs); $a++) { 
      $repaddr[$a] = preg_replace($addr_pattern, '<span class="email" title="$4">$1(replace this parenthesis by @)$2.$3</span>', $the_addrs[$a]); 
     } 
     $cc = str_replace($the_addrs, $repaddr, $content); 
     return $cc; 
} 

Répondre

2

l'option facile peut être vérifier avec strpos pour la présence de parenthèses juste après e-mail, puis en utilisant regex pour trouver la première occurrence de ((.+?)) après le courriel.

L'autre option consiste à ajouter ((.+?))? à votre regex, le dernier point d'interrogation rendra le groupe facultatif.

Ensuite, le code de fou ressemblera:

function pep_replace_excerpt($content) { 
    $addr_pattern = '/([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})(\((.+?)\))?/i'; 
     preg_match_all($addr_pattern, $content, $addresses); 
     $the_addrs = $addresses[0]; 
     for ($a = 0; $a < count($the_addrs); $a++) { 
      if(count($the_addrs[$i]) == 4) 
       $repaddr[$a] = preg_replace($addr_pattern, '$1(replace this parenthesis by @)$2.$3', $the_addrs[$a]); 
      else 
       $repaddr[$a] = preg_replace($addr_pattern, '$1(replace this parenthesis by @)$2.$3', $the_addrs[$a]); 
     } 
     $cc = str_replace($the_addrs, $repaddr, $content); 
     return $cc; 
}
+0

Very nice! Une chose me dérange: 4 $ retournent les parenthis à côté. Y a-t-il un moyen de les supprimer juste à l'intérieur de l'expression rationnelle? Sinon, je suppose que je peux réparer cela à travers les fonctions php. – pixeline

+0

merci :) J'ai édité le motif regex pour que le groupe ne soit que le texte à l'intérieur de la parenthèse. –

+0

mmh, ne fonctionne pas très bien: il semble échouer avec la parenthèse fermante. Je vais continuer à essayer ... HEre est un code de copie/pastable: http://phpbin.net/x/196328853 – pixeline

Questions connexes