регулярное выражение для удаления ссылок

webus

Новичок
регулярное выражение для удаления ссылок

Для удаления URL из данных использую такое рег. выражение:
$Contactinfo = preg_replace("#( |\n|^)(http://)?[0-9a-z_.-/]+?[^@][0-9a-z_.-/]+\.[a-z]{2,4}#is", "", $Contactinfo);

Под фильтр попадают некоторые emailы, содержащие точку. Например, от [email protected] после фильтра остается @urmashop.ru

Не могу разобраться как сделать так чтобы фильтр не трогал emailы, содержащие точку.

Может быть кто-то знает?
 

webus

Новичок
Так?
$Contactinfo = preg_replace("^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$", "", $Contactinfo);

У меня ошибка:
Warning: No ending delimiter '^' found
 

zerkms

TDD infected
Команда форума
напиши для начала регулярку попроще. например регулярку, которая даёт совпадение на 1 любой символ - и сразу поймёшь свою ошибку.
 

webus

Новичок
да, квадратные скобки забыл.
теперь ошибок нет, но это выражение не вырезает url
 

webus

Новичок
url может быть любой, дже такой: http://phpclub.ru/talk/showthread.php?s=&postid=885512#post885512

главное чтобы у url вырезался домен: www.phpclub.ru или phpclub.ru или http://phpclub.ru или http://www.phpclub.ru, но если будет вырезаться и остаток: /talk/showthread.php?s=&postid=885512#post885512 будет еще лучше.

Регулярка которую я сейчас использую не вырезает остаток, только домен
 

dimagolov

Новичок
webus, напиши вызов preg_replace, который заменяет строки из одной буквы 'm' на букву 'k'
 

webus

Новичок
$data = preg_replace("#[m]{1}#", "k", $data );

заменяет в строке букву 'm' на букву 'k'
 

dimagolov

Новичок
webus, я просил не "букву 'm' на букву 'k'", а "строки из одной буквы 'm' на букву 'k'". разницу улавливаешь?
 

webus

Новичок
C_TIGER,
ваше выражение корректирует и emailы

Важно чтобы emailы вообще не корректировались, только url

-~{}~ 19.01.10 21:58:

dimagolov, вот так строка из одной 'm' меняется на 'k'
$Data = preg_replace("#^m$#", "k", $Data);
 

dimagolov

Новичок
webus, ну вот. теперь найди отличия от того, что давало у тебя ошибку Warning: No ending delimiter '^' found
 

webus

Новичок
dimagolov. выражение надо было в записать внутри ##?
Это отличие?
Попробовал, ошибки выдает, ругается на записи типа (?#Protocol).

Пробовал их удалить, стал ругаться так: Warning: Unknown modifier ')'
 

Вурдалак

Продвинутый новичок
webus
Регулярное выражение должно иметь ограничители (delimiter). Где у тебя органичители в выражении из поста от 18.01.10 15:34?
 

webus

Новичок
$Data = preg_replace("/^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$/", "", $Data);


Ограничители поставил, ошибок нет, но это выражение ничего не делает . Какая строка была, такая и осталась.
 

Вурдалак

Продвинутый новичок
Ну, как минимум, стоит убрать "^" и "$" в начале выражение и в конце соответственно.

Потом, не совсем ясно там выложено «чистое» выражение или фактически литеральная константа, т.е. мне непонятно почему экранированы символы "/", ":".
 

Вурдалак

Продвинутый новичок
Тогда остаётся внимательно изучить регулярное выражение и убрать, где надо, "?"
 
Сверху