2013-02-13 4 views
0

Проблема: авторы неправильно добавили адреса электронной почты в CMS, не указав текст «mailto:».Регулярное выражение для замены неработающих ссылок по электронной почте

Мне нужно регулярное выражение, если это возможно, для поиска и замены в хранимой таблице содержимого MySQL.

Случаи, мне нужно, чтобы справиться с являются:

  1. Нет 'электронной почты:'
  2. 'электронной почты:' не уже включен (правильный)
  3. веб-адрес не по электронной почте - не заменить
  4. несколько mailto: требуется (более одного в строке)

Пример строки будет: (разрывы строк добавлены для удобочитаемости)

<a href="[email protected]">[email protected]</a> and 
<a href="mailto:[email protected]">[email protected]</a> and 
<a href="http://www.test.com/">real web link</a> 
second one to replace <a href="[email protected]">[email protected]</a> 

Требуемая мощность будет:

<a href="mailto:[email protected]">[email protected]</a> and 
<a href="mailto:[email protected]">[email protected]</a> and 
<a href="http://www.test.com/">real web link</a> 
second one to replace <a href="mailto:[email protected]">[email protected]</a> 

То, что я пытался (в PHP) и вопросы:

pattern: /href="(.+?)(@)(.+?)(<\/a>)/iU 
replacement: href="mailto:$1$2$3$4 

Это добавление электронной почты: в правильном формате электронной почты: и актерская жадность за последние две ссылки.

Спасибо за любую помощь. Я огляделся, но у меня не хватило времени на это, так как это была неожиданная проблема с контентом.

Если вы в состоянии сэкономить время и дать выражение SQL, это будет еще лучше.

+0

MySQL не имеет REGEXP заменить встроенный Есть определенные пользователем функции, но это похоже на свалку с последующей обработкой офф-лайн лучший вариант - см: [Stack Overflow обсуждение как к -do-a-regular-expression-replace-in-mysql] (http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql) – mjpg

ответ

1

Попробуйте заменить

/href="(?!(mailto:|http:\/\/|www\.))/iU 

с

href="mailto: 

?! свободно означает "все последующие символы не являются их".

Альтернатива:

Заменить

/(href=")(?!mailto:)([^"][email protected])/iU 

с

$1mailto:$2 

[^"]+ означает 1 или более символов, которые не являются ".

Возможно, вам понадобится более сложный шаблон соответствия для гарантированной корректности.

MySQL REGEX соответствия:

См this или this.

+0

Первый работает нормально в PHP, но ему нужно ускользнуть: '/ href =" (?! (Mailto: | http: \/\/| www \.))/IU '; ' – mjpg

+0

Второй дает дубликат, где mailto уже существует: 'mailto: mailto:' Большое спасибо за это - попробую сначала в SQL – mjpg

+0

@mjpg Исправлены ошибки. – Dukeling

0

Используйте следующее в качестве шаблона:

/(href=")(?!mailto:)([email protected]+?")/iU 

и заменить его

$1mailto:$2 

(?!mailto:) является отрицательным опережением проверки следует ли mailto:. Если такого нет, оставшаяся часть проверяется на соответствие. ([email protected]+?") соответствует одному или нескольким символам, за которыми следует @, за которым следует один или несколько символов, за которыми следует ". Оба + не являются жадными.

Соответствующий шаблон заменяется первой группой захвата (href="), за которой следует mailto:, а затем вторая группа захвата (до закрытия ").

+0

Спасибо за это , Кажется, что не работает на второй ссылке электронной почты, которая не имеет mailto: – mjpg

+0

@mjpg, и в этом случае он не работает? он, кажется, работает для вашего примера, насколько я тестировал. –

+0

Для моей установки он не заменяет 'href =" [email protected] "' – mjpg

1

Вы должны сначала применить правильный шаблон почты (например: Using a regular expression to validate an email address), второй поиск mailto: перед тем почту или ничего (например: (mailto:|)), и последние preg_replace_callback костюмов для этого.

Это похоже на работу по вашему желанию (поиск только адресов электронной почты в двойных кавычках);

$s = '<a href="[email protected]">[email protected]</a> and 
<a href="mailto:[email protected]">[email protected]</a> and 
<a href="http://www.test.com/">real web link</a> 
second one to replace <a href="[email protected]">[email protected]</a>'; 
echo preg_replace_callback(
    '~"(mailto:|)([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))"~i', 
    function($m) { 
     // print_r($m); @debug 
     return '"mailto:'. $m[2] .'"'; 
    }, 
    $s 
); 

Выход по вашему желанию; .

 
<a href="mailto:[email protected]">[email protected]</a> and 
<a href="mailto:[email protected]">[email protected]</a> and 
<a href="http://www.test.com/">real web link</a> 
second one to replace <a href="mailto:[email protected]">[email protected]</a> 
+0

Большое спасибо. Это сработало для моего теста, за исключением того, что у меня есть PHP 5.2, поэтому мне пришлось использовать обычную функцию: ' функция cbfunc ($ m) { \t return '"mailto:'. $ М [2] '"'; } \t $ NewStr = preg_replace_callback ( \t '~" (по адресу:.. |) ([_ А-z0-9 -] + (\ [_ а-z0-9- ] +) * @ [а-z0-9 -] + (\ [а-z0-9 -.] +) * (\.[A-Z] {2,4})) "~ я», \t cbfunc, \t $ S \t); ' Однако мне нужно SQL, поэтому preg_replace_callback() не доступна. – mjpg

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