2010-09-23 2 views
2

Я разработал плагин wordpress, который просматривает кучу html и обнаруживает любой адрес электронной почты, заменяя их немаршрутизируемой разметкой html (для того, чтобы быть перерегистрированным как электронное письмо через javascript для лучшее удобство использования).Регулярное выражение: заменить адрес электронной почты, с помощью твиста

Так, например, функция получает:

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

и выходы:

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

Моя функция работает отлично, но я хотел бы теперь, чтобы дать возможность определить, какой читаемый электронную почту должно быть. Таким образом, если функция получает:

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

новый результат будет:

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

Так что регулярное выражение следует искать прикрепленную скобку, и если нашел, взять то, что внутри и добавить атрибут заголовка HTML, удалить скобки, а затем проанализировать электронную почту.

Я почти не знаю, как это произошло, из-за необязательного характера функции (что означает: эти скобки не всегда будут там).

Любой указатель будет полезен, вот мой текущий код:

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

ответ

2

Легкий вариант может проверять с StrPos на наличие круглых скобках сразу после электронной почты, а затем с помощью регулярных выражений, чтобы найти первое вхождение ((.+?)) после электронная почта.

Другой вариант - добавить ((.+?))? к вашему регулярному выражению, последний вопросительный знак сделает группу необязательной.

Тогда код дурак будет выглядеть следующим образом:

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

Очень приятно! Меня беспокоит одна вещь: 4 доллара возвращают парентис вместе. Есть ли способ удалить их прямо внутри регулярного выражения? В противном случае я могу исправить это через php-функции. – pixeline

+0

thanks :) Я отредактировал шаблон регулярного выражения так, чтобы группа была только текстом внутри скобки. –

+0

mmh, не работает слишком хорошо: он, кажется, терпит неудачу с закрывающей скобкой. я буду продолжать пытаться ... HEre - это скопированный/готовый код: http://phpbin.net/x/196328853 – pixeline

Смежные вопросы