Как удалить в строке url (типа mysite.com) но оставить email?

webus

Новичок
Как удалить в строке url (типа mysite.com) но оставить email?

Не могу разобраться как удалить из строки url (которые могут быть записаны как угодно: http://www.mysite.com или www.mysite.com или mysite.com), но при этом оставить email

Пробую таким образом:
$Text = ereg_replace("[0-9A-Za-z_\.\-]+\.[A-Za-z]{2,6}", "", $Text);
Удаляются все что похоже на mysite.com
НО email (например: [email protected]) не сохраняется а обрезается : email@

Может кто нибудь помочь?
 

x-yuri

Новичок
а эти урлы не обязательно в ссылках должны быть?

-~{}~ 02.01.09 21:43:

а в урл возможны '_'? а есть домены верхнего уровня в 5-6 символов?

во-первых, я бы написал как-то так
PHP:
preg_replace('/[0-9a-z.-]+\.[a-z]{2,4}/i', '', $Text)
а во-вторых почитай про утверждения (http://ua.php.net/manual/ru/regexp.reference.php)
 

webus

Новичок
урлы в обычном тексте, куда могут попытаться поместить как адрес сайта так и email
вот и хочу попытаться emailы оставить а урлы удалить
причем урлы не обязательно могут начинаться с http:// или www
а сразу может идти название домена

-~{}~ 02.01.09 22:49:

Автор оригинала: x-yuri

PHP:
preg_replace('/[0-9a-z.-]+\.[a-z]{2,4}/i', '', $Text)
Здесь вырезается все и от emailа [email protected] остается только email@

Должна быть какаято проверка что удалять только в том случае если строка не содержит символ @
 

webus

Новичок
похоже что утверждения это действительно то что нужно
но разобраться с ними не просто
Пробую вот так:

$Text = ereg_replace("(?<!@)[0-9A-Za-z_\.\-]+\.[A-Za-z]{2,4}", "", $Text);

(?<!@) - означает что будут выбраны только те [0-9A-Za-z_\.\-]+\.[A-Za-z]{2,4} которым предшествует @

НО не работает - выдает Warning: ereg_replace(): REG_BADRPT:lrepetition-operator operand invalid
 

x-yuri

Новичок
в php есть 2 набора функций по работе с регулярными выражениями: PCRE (preg_...) и POSIX (ereg_...). В POSIX утверждений нет

кроме того,
Внимание
These regular expression functions are not binary-safe. The PCRE functions are.

Замечание: As of PHP 5.3.0 this extension is deprecated, calling any function provided by this extension will issue an E_DEPRECATED notice.
http://www.php.net/manual/ru/intro.regex.php

-~{}~ 02.01.09 23:17:

p.s. раз ты пользовался POSIX-функцией, можно было написать так
PHP:
'[[:alnum:].-]+\.[[:alpha:]]{2,4}'
p.p.s. в классах символов '.' экранировать не надо, как и '-' в конце

-~{}~ 02.01.09 23:22:

p.p.p.s. знак подчеркивания нельзя использовать в доменных именах

-~{}~ 02.01.09 23:28:

кстати, сории, rfс 2396 не ставит ограничений на размер доменов верхнего уровня
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
хотя ты можешь ориентироваться на список существующих доменов (http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains)
 

webus

Новичок
почему то когда я использую preg_ у меня выскакивают ошибки типа Unknown modifier '['
как будто тут синтаксис регулярного выражения другой нужно использовать для PCRE - функций

Я делаю так:
$Text = preg_replace("(?<!@)[0-9A-Za-z_\.\-]+\.[A-Za-z]{2,4}", "", $Text);
 

DiMA

php.spb.ru
Команда форума
$Text = preg_replace("~(?<!@)[0-9A-Za-z_.-]+\.[A-Za-z]{2,4}~", "", $Text);
 

x-yuri

Новичок
как будто тут синтаксис регулярного выражения другой нужно использовать для PCRE - функций
синтаксис другой (http://ua.php.net/manual/ru/reference.pcre.pattern.syntax.php, http://www.tin.org/bin/man.cgi?section=7&topic=regex)
кроме того регулярное выражение нужно чем-то ограничивать, стандартно - '/' ('/(?<!@)[0-9A-Za-z_\.\-]+\.[A-Za-z]{2,4}/'). Можно как тебе предложили. Скобки тоже могут выступать в качестве ограничителей. Таким образом, твое регулярное выражение - '?<!@', а '[0-9A-Za-z_\.\-]+\.[A-Za-z]{2,4}' пытается восприниматься как модификаторы регулярного выражения
 

x-yuri

Новичок
похоже все-таки прийдется тебе воспользоваться preg_match_all
 

webus

Новичок
$Text = preg_replace("# (http://)?[0-9A-Za-z_\.\-/]+?[^@]{1}[0-9A-Za-z_\.\-/]+\.[A-Za-z]{2,4}#is", "", $Text);

вот так работает
 

x-yuri

Новичок
ты вообще слушаешь, что тебе советуют?

[^@]{1} - то же самое, что [^@]

зачем ты добавил модификатор i, если в шаблонах продолжаешь писать A-Za-z?

зачем ты добавил модификатор s, если не пользуешься точкой в шаблоне. Тебе этот модификатор в общем-то и не нужен

чем
[0-9A-Za-z_\.\-/]+?[^@]{1}[0-9A-Za-z_\.\-/]+
лучше
[0-9a-z_.-/]+
?

добавлением / в шаблон, ты учитываешь наличие пути к скрипту? а [A-Za-z]{2,4} у тебя теперь обозначает не только домен верхнего уровня, но и расширение скрипта? ты просто подстраивашь шаблон, под свои тестовые строки

а пробел в начале выражения лучше заменить на \b

p.s. если ты хочешь учитывать все возможные варианты URL тебе стоит посмотреть rfc 2396
 

webus

Новичок
Автор оригинала: x-yuri
[^@]{1} - то же самое, что [^@]
согласен
зачем ты добавил модификатор i, если в шаблонах продолжаешь писать A-Za-z?
согласен
чем
[0-9A-Za-z_\.\-/]+?[^@]{1}[0-9A-Za-z_\.\-/]+
лучше
[0-9a-z_.-/]+
?
согласен
добавлением / в шаблон, ты учитываешь наличие пути к скрипту?
да

а [A-Za-z]{2,4} у тебя теперь обозначает не только домен верхнего уровня, но и расширение скрипта? ты просто подстраивашь шаблон, под свои тестовые строки
не знаю, но хочется удалить полностью ссылку, если например она имеет такой вид http://www.site.ru/object.php?id=2720

а пробел в начале выражения лучше заменить на \b
заменять так нельзя - email начинает вырезаться

p.s. если ты хочешь учитывать все возможные варианты URL тебе стоит посмотреть rfc 2396
наверно мне пока достаточно [A-Za-z]{2,4} таких доменов верхнего уровня

Сейчас возникло 2 вопросы, которые пытаюсь решить:
1) хочется удалить полностью ссылку, если например она имеет такой вид http://www.site.ru/object.php?id=2720

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

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

НО мне приходится писать 2 раза, чтобы удалить как в случае если пробел перед строкой так и если новая строка
$Text = preg_replace("# (http://)?[0-9a-z_.-/]+?[^@][0-9a-z_.-/]+\.[a-z]{2,4}#is", "", $Text);
$Text = preg_replace("#\n(http://)?[0-9a-z_.-/]+?[^@][0-9a-z_.-/]+\.[a-z]{2,4}#is", "", $Text);

Пытаюсь объединить:
$Text = preg_replace("# |\n(http://)?[0-9a-z_.-/]+?[^@][0-9a-z_.-/]+\.[a-z]{2,4}#is", "", $Text);

Но не работает
 

x-yuri

Новичок
добавлением / в шаблон, ты учитываешь наличие пути к скрипту?

да

а [A-Za-z]{2,4} у тебя теперь обозначает не только домен верхнего уровня, но и расширение скрипта? ты просто подстраивашь шаблон, под свои тестовые строки

не знаю, но хочется удалить полностью ссылку, если например она имеет такой вид http://www.site.ru/object.php?id=2720
надо не подстраивать шаблон уже написанный вариант под более полные URI, а дописывать шаблон. Для доменного имени шаблон написал? Отлично. Добавь к нему выражение, которое будет сопоставлятся с путем и строкой запроса

а пробел в начале выражения лучше заменить на \b

заменять так нельзя - email начинает вырезаться
да, извиняюсь, был не прав

p.s. если ты хочешь учитывать все возможные варианты URL тебе стоит посмотреть rfc 2396

наверно мне пока достаточно [A-Za-z]{2,4} таких доменов верхнего уровня
в этом rfc речь не о доменах верхнего уровня, а о том, как составить регулярное выражение для URI ;-)

-~{}~ 04.01.09 02:14:

http://www.ietf.org/rfc/rfc2396.txt
посмотри приложение A - это описание, из каких компонентов состоит URI и какие символы где допустимы
приложение B - регулярное выражение для парсинга URI (оно, конечно очень общее, ну так сделай его более конкретным, под протокол http)

-~{}~ 04.01.09 02:20:

2) http://ua2.php.net/manual/ru/regexp.reference.php, раздел 'Вертикальная черта'

-~{}~ 04.01.09 05:53:

даже не так, в rfc указано регулярное выражение, чтобы из URI вытащить компоненты

самое простое решение - искать последовательность допустимых символов (uric), но тогда под него подойдет любой английское слово. Следующий шаг - разбить шаблон на три части: схема, сервер, все остальное. Схема - понятно, сервер - любые допустимые символы кроме @, но обязательно с точкой, остальное - любые допустимые символы

p.s. заметь в ftp-ссылке может использоваться @
 

webus

Новичок
Из приложения B:
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?

это для меня слишком непонятно - попробовал конечно - но ничего полезного не получилось! :)

Получилось объеденить 2 выражения в 1 с помощью маски и логического или. Спасибо за подсказку:

$Text = preg_replace("#( |\n|^)(http://)?[0-9a-z_.-/]+?[^@][0-9a-z_.-/]+\.[a-z]{2,4}#is", "", $Text);

теперь удаляет и если url расположен в самом начале и если после пробела и с новой строки.

?id=2720 - вот это тока не удаляется
 

x-yuri

Новичок
это для меня слишком непонятно - попробовал конечно - но ничего полезного не получилось!
я вообще-то добавил потом, что то регулярное выражение не для вырезания URI из строк

[0-9a-z_.-/]+?[^@][0-9a-z_.-/]+
ты же согласился, что это ни чем не лучше
[0-9a-z_.-/]+

Повторяю еще раз (правда немного по-другому) что тебе делать с твоим регулярным выражением: со схемой у тебя вроде все нормально. Для того, чтобы это выражение не срабатывало на слова достаточно я думаю потребовать наличие точки (всегда будет доменное имя или ip-адрес, в которых наверняка будет точка). Т.е. выражение должно иметь вид
Код:
"#( |\n|^)([url]http://[/url])?<выражение для доменного имени><выражение для оставшейся части URI>#is"
в <выражение для доменного имени> мы требуем любой из допустимых в этой части символов плюс обязательно точка и обязательно нету @
в <выражение для оставшейся части URI> мы требуем любой из допустимых в этой части символов
 
Сверху