Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Замена части текста на ссылку
 
 автор: Анатолий501   (17.08.2009 в 19:22)   письмо автору
 
 

Добрый день. Подскажите пожалуйста, как мне сделать, чтобы в тексте все что находится после http:// и до пробела заменялось на ссылку <a href>... и т. д. Спасибо большое.

  Ответить  
 
 автор: mehelson   (17.08.2009 в 20:47)   письмо автору
 
   для: Анатолий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);
?>

  Ответить  
 
 автор: tvv123456   (17.08.2009 в 21:06)   письмо автору
 
   для: mehelson   (17.08.2009 в 20:47)
 

у вас тут только поддерживаються ссылки на html страницы? А что делать если ссылка на .php или .htm или .aspx...?

  Ответить  
 
 автор: heed   (17.08.2009 в 22:45)   письмо автору
 
   для: tvv123456   (17.08.2009 в 21:06)
 

>ссылки на html страницы?
похоже нет.
выбирается всё, но не слэши

> А что делать если ссылка на .php или .htm или .aspx...?
ув.Mehelson предусмотрел такой вопрос ,)
поэтому он добавил необязательный блок ([-a-z0-9]+\.(html))?
там на своё усмотрение желающие смогут добавить слэш , и .php или .htm или .aspx... )

  Ответить  
 
 автор: gurza   (17.08.2009 в 23:08)   письмо автору
 
   для: 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 вобщем на любые должно работать

  Ответить  
 
 автор: heed   (18.08.2009 в 00:20)   письмо автору
 
   для: 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&amp;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$o2); 
print_r($o);

preg_match_all($p2$content$o2); 
print_r($o);
?>

[-a-z0-9\./]+([-a-z0-9]+\.)?
Здесь неодного совпадения с ([-a-z0-9]+\.)? $1 всегда остаётся пустой
потомучто [-a-z0-9\./] с жадным квантификатором +
(по умолчанию все квантификаторы("операторы" повторения) жадные)
тк вот, [...]+ совпало со всем чем только могло и даже если сделать.php.?
, всёравно перед вопросом небудет захвачено (p.)

и так, по мелочи, есть к чему зацепиться
[0-9a-z_^\.] символ ^ ненужен точка всёравно входит
и по поводу таких какими могут и не могут быть адреса
можно разговаривать долго и безрезультатно :)

  Ответить  
 
 автор: а-я   (18.08.2009 в 08:17)   письмо автору
 
   для: Анатолий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&amp;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);
?>

  Ответить  
 
 автор: heed   (18.08.2009 в 09:00)   письмо автору
 
   для: а-я   (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);
?>

  Ответить  
 
 автор: а-я   (18.08.2009 в 09:38)   письмо автору
 
   для: heed   (18.08.2009 в 09:00)
 

ого)
а так?

<?

echo preg_replace('|http://[^ "\']+|si''<a href="\\0">\\0</a>'$content);
?>

  Ответить  
 
 автор: heed   (18.08.2009 в 10:36)   письмо автору
 
   для: а-я   (18.08.2009 в 09:38)
 

так уже лучше ,)
да и так я, почти пошутил :)
это как
($content = 'text http://<!-- text
text BIGTEXT http://,-->site.ru/; text ';)

но '&' (амперсанд) преобразуется в '&amp;'
'"' (двойная кавычка) преобразуется в '&quot;' если ENT_NOQUOTES не установлен.
''' (одиночная кавычка) преобразуется в '&#039;' только в режиме ENT_QUOTES.
'<' (знак "меньше чем") преобразуется в '&lt;'
'>' (знак "больше чем") преобразуется в '&gt;'

и ENT_NOQUOTES не установлен обычно по умолчанию
, так что htmlspecialchars() поможет ;)


, но всё что угодно интерпритируется как ссылка
, а может в тексте будет перечисление http://,https://,ftp://,ftps://,udp://...:)
впрочем, если проверять ссылки на валидность, то это наверное будет длинное выражение ,
и всёравно они смогут оказаться недействующими

  Ответить  
 
 автор: а-я   (18.08.2009 в 11:29)   письмо автору
 
   для: 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);
?>

  Ответить  
 
 автор: heed   (18.08.2009 в 13:33)   письмо автору
 
   для: а-я   (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$o2);  
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+, как более жадный вариант ,)

  Ответить  
 
 автор: а-я   (18.08.2009 в 13:45)   письмо автору
 
   для: heed   (18.08.2009 в 13:33)
 

>перечисление http://, https://, ftp://, ftps://, udp://

=) может проверить длину?

|[a-z]{3,5}://[^ ]{2,}+|si

  Ответить  
 
 автор: heed   (18.08.2009 в 16:06)   письмо автору
 
   для: а-я   (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 символов, тоже самое получите.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования