|
|
|
| Добрый день. Подскажите пожалуйста, как мне сделать, чтобы в тексте все что находится после http:// и до пробела заменялось на ссылку <a href>... и т. д. Спасибо большое. | |
|
|
|
|
|
|
|
для: Анатолий501
(17.08.2009 в 19:22)
| | При помощи регулярных выражений.
<?
$content = "text text text http://www.site.com text text text http://site.net text text text site@site.org";
$pattern = array("#http://[-a-z0-9\.]+([-a-z0-9]+\.(html))?"."([-a-z0-9_:@&\?=+\.~*'%$]+)?#i", "/[0-9a-z_\.]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i");
$replacement = array("<a href=\\0>\\0</a>", "<a href=mailto:\\0>\\0</a>");
echo preg_replace($pattern, $replacement, $content);
?>
|
| |
|
|
|
|
|
|
|
для: mehelson
(17.08.2009 в 20:47)
| | у вас тут только поддерживаються ссылки на html страницы? А что делать если ссылка на .php или .htm или .aspx...? | |
|
|
|
|
|
|
|
для: tvv123456
(17.08.2009 в 21:06)
| | >ссылки на html страницы?
похоже нет.
выбирается всё, но не слэши
> А что делать если ссылка на .php или .htm или .aspx...?
ув.Mehelson предусмотрел такой вопрос ,)
поэтому он добавил необязательный блок ([-a-z0-9]+\.(html))?
там на своё усмотрение желающие смогут добавить слэш , и .php или .htm или .aspx... ) | |
|
|
|
|
|
|
|
для: tvv123456
(17.08.2009 в 21:06)
| |
<?
$content = "text http://site.ru/test.aspx text http://site.ru/test.php?id=1&x=5 text http://www.site.com/page.php?id=12 text http://site.ru/test.html text http://site.ru/test.htm text http://site.net text text text site@site.org";
$pattern = array("#http://[-a-z0-9\./]+([-a-z0-9]+\.)?"."([-a-z0-9_:@&\?=+\.~*'%$]+)?#i", "/[0-9a-z_\.]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i");
$replacement = array("<a href=\\0>\\0</a>", "<a href=mailto:\\0>\\0</a>");
echo preg_replace($pattern, $replacement, $content);
?>
|
вот и для страницы с .php .htm или .aspx вобщем на любые должно работать | |
|
|
|
|
|
|
|
для: gurza
(17.08.2009 в 23:08)
| | скобки () замедляют, потомучто приходится выделять память под значения
захваченные захватывающими подмасками, и в данном конкретном случае было-бы
получше применение (?: незахватывающих ) подмасок , или совсем отказаться, где можно
Но, зато можно проследить логику поведения выражений.
И удобнее preg_match_all() , чтобы понять.
<?
header('Content-type:text/plain; charset=windows-1251');
$content = "text http://site.ru/test.aspx text
http://site.ru/test.php?id=1&x=5 text
http://www.site.com/page.php?id=12 text
http://www.site.com/page.php?id=12&x=1 text
http://site.ru/test.html
text http://site.ru/test.htm text
http://site.net text text
text site@site.org
site@site.info
";
$p1 = "#http://[-a-z0-9\./]+([-a-z0-9]+\.)?"
. "([-a-z0-9_:@&\?=+\.~*'%$]+)?#i";
$p2 = "/[0-9a-z_\.]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i";
preg_match_all($p1, $content, $o, 2);
print_r($o);
preg_match_all($p2, $content, $o, 2);
print_r($o);
?>
|
[-a-z0-9\./]+([-a-z0-9]+\.)?
Здесь неодного совпадения с ([-a-z0-9]+\.)? $1 всегда остаётся пустой
потомучто [-a-z0-9\./] с жадным квантификатором +
(по умолчанию все квантификаторы("операторы" повторения) жадные)
тк вот, [...]+ совпало со всем чем только могло и даже если сделать.php.?
, всёравно перед вопросом небудет захвачено (p.)
и так, по мелочи, есть к чему зацепиться
[0-9a-z_^\.] символ ^ ненужен точка всёравно входит
и по поводу таких какими могут и не могут быть адреса
можно разговаривать долго и безрезультатно :) | |
|
|
|
|
|
|
|
для: Анатолий501
(17.08.2009 в 19:22)
| | по теме
от http:// до " " - пробела, только ссылки:
<?
$content = "
text http://site.ru/test.aspx text
http://site.ru/test.php?id=1&x=5 text
http://www.site.com/page.php?id=12 text
http://www.site.com/page.php?id=12&x=1 text
http://site.ru/test.html
text http://site.ru/test.htm text
http://site.net text text
text site@site.org
site@site.info
";
echo preg_replace('|http://[^ ]+|si', '<a href="\\0">\\0</a>', $content);
?>
|
| |
|
|
|
|
|
|
|
для: а-я
(18.08.2009 в 08:17)
| | по теме да
, Но
<?
$content = 'text http://site.ru/test.aspx text
text http://site.ru/"onmouseover="document.location.href=\'http://localhost\'"style="display:block; text
';
echo preg_replace('|http://\S+|', '<a href="\\0">\\0</a>', $content);
?>
|
| |
|
|
|
|
|
|
|
для: heed
(18.08.2009 в 09:00)
| | ого)
а так?
<?
echo preg_replace('|http://[^ "\']+|si', '<a href="\\0">\\0</a>', $content);
?>
|
| |
|
|
|
|
|
|
|
для: а-я
(18.08.2009 в 09:38)
| | так уже лучше ,)
да и так я, почти пошутил :)
это как
($content = 'text http://<!-- text
text BIGTEXT http://,-->site.ru/; text ';)
но '&' (амперсанд) преобразуется в '&'
'"' (двойная кавычка) преобразуется в '"' если ENT_NOQUOTES не установлен.
''' (одиночная кавычка) преобразуется в ''' только в режиме ENT_QUOTES.
'<' (знак "меньше чем") преобразуется в '<'
'>' (знак "больше чем") преобразуется в '>'
и ENT_NOQUOTES не установлен обычно по умолчанию
, так что htmlspecialchars() поможет ;)
, но всё что угодно интерпритируется как ссылка
, а может в тексте будет перечисление http://,https://,ftp://,ftps://,udp://...:)
впрочем, если проверять ссылки на валидность, то это наверное будет длинное выражение ,
и всёравно они смогут оказаться недействующими | |
|
|
|
|
|
|
|
для: heed
(18.08.2009 в 10:36)
| | ну) тогда что-то в этом роде
<?
$content = "
text http://site.ru/test.aspx text
http://site.ru/test.php?id=1&x=5 text
http://www.site.com/page.php?id=12 text
http://www.site.com/page.php?id=12&x=1 text
http://site.ru/test.html
text http://site.ru/test.htm text
https://site.net text text
text site@site.org
site@site.info
";
$content = htmlspecialchars($content);
echo preg_replace('#(http|https|ftp|ftps|udp)://[^ ]+#si', '<a href="\\0">\\0</a>', $content);
// или даже
echo preg_replace('|[a-z]{3,5}://[^ ]+|si', '<a href="\\0">\\0</a>', $content);
?>
|
| |
|
|
|
|
|
|
|
для: а-я
(18.08.2009 в 11:29)
| | ну если тоже не по теме ,)
то я примерно о таких возможных перечислениях говорил
<?
header('Content-type:text/plain; charset=windows-1251');
$content = "
text http://site.ru/test.aspx text
http://site.ru/test.php?id=1&x=5 text
перечисление http://,https://,ftp://,ftps://,udp://...:)
https://site.net text text
http://127.0.0.1/test.php?id=1&x=5 text
";
$content = htmlspecialchars($content);
$p = '#\b(ftps?|https?)://\S+#';
preg_match_all($p, $content, $o, 2);
print_r($o);
?>
|
просто если надо будет исключить такие совпадения
, тогда даже
$p = '#\b(?:https?|ftps?)://\b(?:[-0-9a-z]+\.)+(?:[a-z]{2,4}|\d{1,3})\b\S*#';
| не чётко определяет адресс после http:// или не адресс
,хоть и всётаки койчего уже отсеит,
, но и hellofworld.666 и 1.2.3.4.5.678 тоже не адрес, и есть домены где зона длиннее чем .info .azia ...
,но переделывать выражения при каждом добавлении новых доменных зон, нереально
и тут не учитывается, что может быть указан номер порта после двоеточия(, но проходит)
или логин пользователя и пароль с символами : и @ (не проходит)
есть домены русскими буквами
анализировать текст за каждим имеющимся в тексте https? тоже накладно
, поэтому тоже думаю что \b(?:https?|ftps?)://\S+, как более жадный вариант ,) | |
|
|
|
|
|
|
|
для: heed
(18.08.2009 в 13:33)
| | >перечисление http://, https://, ftp://, ftps://, udp://
=) может проверить длину?
|[a-z]{3,5}://[^ ]{2,}+|si
|
| |
|
|
|
|
|
|
|
для: а-я
(18.08.2009 в 13:45)
| | Максимальная длина доменного имени (между разделительными точками) согласно RFC 1035 составляет 63 символа. Общая же длина имени (включая имена субдоменов, разделительные точки и имя зоны) ограничена 255 знаками.
Многие доменные зоны согласно RFC 1535 накладывают также ограничения на минимальную длину доменного имени - 3 символа ( для некоторых зон 2 символа).
Информация взята с http://help.hc.ru/print/714/
если речь о доменных именах
, про полностью длинну запрашиваемого uri (REQUEST_URI) нашёл только
то что не все старые клиенты поддерживают длинну более 255 байт
Note: Servers ought to be cautious about depending on URI lengths
above 255 bytes, because some older client or proxy
implementations might not properly support these lengths.
и что сервер должен послать код 414 если слишком длинный uri
414 Request-URI Too Long
The server is refusing to service the request because the Request-URI
is longer than the server is willing to interpret. This rare
condition is only likely to occur when a client has improperly
converted a POST request to a GET request with long query
information, when the client has descended into a URI "black hole" of
redirection (e.g., a redirected URI prefix that points to a suffix of
itself), or when the server is under attack by a client attempting to
exploit security holes present in some servers using fixed-length
buffers for reading or manipulating the Request-URI.
По форумам находил что-то
Jooz
Ограничения есть, 2000 - 4000 символов не более в зависимости от браузера и ОС. А в прокси серверах типа squid там это еще круче вышито где-то 250 символов.
Добавлено через 34 секунды
Цитата:Сообщение от sergbond
Из-за чего произошла ошибка - я понимаю. Не понимаю, как можно было так написать, что такая ошибка стала возможна.
А вы в гугл введите в строку поиска более 2000 символов, тоже самое получите. | |
|
|
|