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

Форум PHP

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

 

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

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

тема: Поиск ссылок в тексте
 
 автор: Shorr Kan   (07.06.2005 в 22:28)   письмо автору
 
 

Из textarea приходит текст. В нем могут быть http://что-нибудь

Как из пришедшего текста получить текст, в котором текстовые ссылки исправлены на html'ные? То есть, пришло:

"Заходите на http://www.www.www/qqq.html"

А должно стать

"Заходите на <a href='http://www.www.www/qqq.html' target='_blank'>http://www.www.www/qqq.html</a>"



И второй вопрос... Если в текстареа человек пишет - все нормально. Если же копирует откуда-то, то текст - без переносов. Мой метод это правит, но он не слишком мне удобен. Возможно, есть какие-нибудь еще?

   
 
 автор: antf   (07.06.2005 в 22:48)   письмо автору
 
   для: Shorr Kan   (07.06.2005 в 22:28)
 

Попробуйте так:
<?  
  $str 
"sffsdfsda http://www.www.www/qqq.html adsadf";
  
$str preg_replace("/(http:\/\/[^\s]+)/""<a href='$1' target='_blank'>$1</a>"$str);
  print 
$str;
?>

Один нюанс: после ссылки должен стоять пробел, перенос строки или табулятор.

   
 
 автор: antf   (07.06.2005 в 22:49)   письмо автору
 
   для: antf   (07.06.2005 в 22:48)
 

>> Если же копирует откуда-то, то текст - без переносов.
Что вы имеете в виду под переносами?

   
 
 автор: Shorr Kan   (07.06.2005 в 22:56)   письмо автору
 
   для: antf   (07.06.2005 в 22:49)
 

Enter. Если он нажимается в текстареа - все нормально. Но если текст копируется откуда-либо....

И еще одна проблема - нет сохранения форматирования текста из текстареа... Т.е., пробелы довольно скудные - если человек нажал десять раз на пробел, то в приходящей переменной будет все равно только один пробел... А то и вообще не будет. Во, сформулировал! Отсутствуют красные строки.

   
 
 автор: antf   (07.06.2005 в 23:21)   письмо автору
 
   для: Shorr Kan   (07.06.2005 в 22:56)
 

1) С переводами строки все плохо. Откуда машина узнает, где они нужны :) ? Вот если бы найти четкий формальный признак, например, ставить переводы строк после ссылок... Хотя если текст вставляется из буфера обмена, то переводы строк должны сохраняться.
2)
>>И еще одна проблема - нет сохранения форматирования текста из текстареа... Т.е., пробелы довольно скудные - если человек нажал десять раз на пробел, то в приходящей переменной будет все равно только один пробел... А то и вообще не будет. Во, сформулировал! Отсутствуют красные строки.

А вы попробуйте заключать абзацы в теги:
<?
  
//содержимое вашего поля textarea
  
$textarea $_POST['textarea'];
  
$textarea "<div style='padding-left:20px'>".$textarea."</div>";
  
$textarea str_replace("\n""</div><div style='padding-left:20px'>", );
?>

   
 
 автор: Shorr Kan   (07.06.2005 в 23:53)   письмо автору
 
   для: antf   (07.06.2005 в 23:21)
 

Хмм... Это дело будет на почту рассылаться... как-то div там неуместен... на мой взгляд. Или я ошибаюсь?

А с регулярным - работает все правильно, благодарю.

   
 
 автор: antf   (07.06.2005 в 23:21)   письмо автору
 
   для: Shorr Kan   (07.06.2005 в 22:56)
 

Модераторам: Послал предыдущий ответ еще раз. Удалите это сообщение.

   
 
 автор: antf   (07.06.2005 в 23:40)   письмо автору
 
   для: antf   (07.06.2005 в 23:21)
 

Удалите только лишние пробелы:

<?
  $str 
preg_replace("/ {2,}/"" "$str);
?>


PS Видно все неудобство спецсимвола \s, переводы строки нам заменять не надо, приходится делать регулярное выражение менее читабельным, используя пробел напрямую, хотя если проделывать это после замены \n на теги, можно сделать так:

<?
  $str 
preg_replace("/\s{2,}/"" "$str);
?>

   
 
 автор: Shorr Kan   (08.06.2005 в 00:07)   письмо автору
 
   для: antf   (07.06.2005 в 23:40)
 

Вы хотите сказать, что второй вариант много более читабелен? :)

Но тем не менее, ни один из них - не сработал.



$str=preg_replace("/(http:\/\/[^\s]+)/", "<a href='$1' target='_blank'>$1</a>", $str);
$str=nl2br(stripslashes($str));
$str=preg_replace("/ {2,}/", " ", $str);

и

$str=preg_replace("/(http:\/\/[^\s]+)/", "<a href='$1' target='_blank'>$1</a>", $str);
$str=nl2br(stripslashes($str));
$str=preg_replace("/\s{2,}/", " ", $str); 

оба дали безкраснострочный текст. И безпроизвольнопробельный.

   
 
 автор: glsv (Дизайнер)   (08.06.2005 в 04:52)   письмо автору
 
   для: Shorr Kan   (08.06.2005 в 00:07)
 

>оба дали безкраснострочный текст. И безпроизвольнопробельный.
Хм... но эти строки не дадут такой результат. Они убирают "лишние" пробелы и оставляют только один пробел. А вам нужно наоборот, как я понял.

$str=preg_replace("/ {2,}/", " ", $str);
$str=preg_replace("/\s{2,}/", " ", $str);

   
 
 автор: glsv (Дизайнер)   (08.06.2005 в 04:43)   письмо автору
 
   для: Shorr Kan   (07.06.2005 в 22:56)
 

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

Это свойство HTML. Сколько бы пробелов не было - отображен будет только один.
Для того, чтобы полностью сохранить пользовательское форматирование (пробелы и переводы строк) при выводе на страницу заключите выводимый текст в теги <pre>

<?
  
echo "<pre>";
  echo 
$msg;
  echo 
"</pre>";
?>

   
 
 автор: Shorr Kan   (08.06.2005 в 08:28)   письмо автору
 
   для: glsv (Дизайнер)   (08.06.2005 в 04:43)
 

Отлично, спасибо. Но если у человека в почтовом клиенте включен текстовый режим... Могут отображаться все теги текстом. Можно этого избежать?

   
 
 автор: glsv (Дизайнер)   (08.06.2005 в 08:43)   письмо автору
 
   для: Shorr Kan   (08.06.2005 в 08:28)
 

Ай, совсем забыл, что у вас почта.
А ведь в этом случае, письмо как бы в 2 вариантах "пишут".
1 - обычный текст. В этом виде пробелы должны отобразиться "как есть".
2 - вложение в виде HTML-странички.
По умолчанию, должна открыться html-страница. Если человек переключит на текстовый режим, то ему отобразиться письмо в виде текста.

   
 
 автор: Shorr Kan   (08.06.2005 в 15:48)   письмо автору
 
   для: glsv (Дизайнер)   (08.06.2005 в 08:43)
 

Хм... Я не совру, если скажу что мне малопонятно, как можно написать письмо в двух вариантах.

   
 
 автор: glsv (Дизайнер)   (09.06.2005 в 04:33)   письмо автору
 
   для: Shorr Kan   (08.06.2005 в 15:48)
 

Про 2 варианта - это я запутал, конечно.
Обычное письмо, но в качестве вложения идет HTML-страница, в котором повторяется сообщение, набранное в теле письма.

Про отправку письма с вложением можно почитать по следующим ссылкам
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=990
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=3700
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=3935

   
 
 автор: Shorr Kan   (09.06.2005 в 04:38)   письмо автору
 
   для: glsv (Дизайнер)   (09.06.2005 в 04:33)
 

Ага, ясненько... А как в обычном письме (тексте) хоть какие-то переносы поставить? Чтоб не сплошным текстом. \r\n ?

   
 
 автор: Ziq   (09.06.2005 в 06:40)   письмо автору
 
   для: Shorr Kan   (09.06.2005 в 04:38)
 

\n

   
Rambler's Top100
вверх

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