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

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

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

 

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

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

тема: Обработчику передается $1
 
 автор: Z3RO   (27.02.2012 в 17:58)   письмо автору
 
 

Вобщем есть у меня поиск ЮРЛ адресов по выражению и последующая его обработка функцией getURL:


$str = preg_replace("#http://([а-яёa-z\d][а-яёa-z\d\-]*\.)+[а-яёa-z]{2,6}(/([а-яё\w\-\.]*[а-яё\w\-/]{1})*(\?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?(&(amp;)?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?)*)?)?#ui", getURL('$0'), $str);

function getURL($url)
{
  if(mb_strlen($url, U) > 35)
    $urlName = mb_substr($url, 0, 25, U) . '...' . mb_substr($url, mb_strlen($url, U) - 5, 5, U);
  else
    $urlName = $url;
  $url = '<a href="' . $url . '">' . $urlName . '</a>';
  return $url;
}


Ссылка выводится правильно, но не обрезается. При замене последних двух строк на

//$url = '<a href="' . $url . '">' . $urlName . '</a>';
return $url;


как результат я получаю "2". В чем проблема?

  Ответить  
 
 автор: Z3RO   (27.02.2012 в 18:57)   письмо автору
 
   для: Z3RO   (27.02.2012 в 17:58)
 

Константа U = 'UTF-8';

  Ответить  
 
 автор: Z3RO   (27.02.2012 в 19:07)   письмо автору
 
   для: Z3RO   (27.02.2012 в 17:58)
 

Или же предложите другой вариант передачи результата функции, но только именно с этим выражением.

  Ответить  
 
 автор: Z3RO   (28.02.2012 в 01:01)   письмо автору
 
   для: Z3RO   (27.02.2012 в 19:07)
 

Я канешн извиняюсь, но помогите, пожалуйста.

  Ответить  
 
 автор: Sfinks   (28.02.2012 в 10:11)   письмо автору
 
   для: Z3RO   (28.02.2012 в 01:01)
 

Не очень понятно почему в вашем варианте происходит именно так, но работает вот так:
<?php
  mb_internal_encoding
("utf-8");

  function 
getURL($matches){
    if(
mb_strlen($matches[0]) > 35)
      
$urlName mb_substr($matches[0], 025) . '...' mb_substr($matches[0], mb_strlen($matches[0]) - 5);
    else
      
$urlName $matches[0];
    
$url '<a href="' $matches[0] . '">' $urlName '</a>';
    return 
$url;
  }

  
$str "http://softtime.ru/forum/read.php?id_forum=6&id_theme=85370";
  
$pattern "#http://([а-яёa-z\d][а-яёa-z\d\-]*\.)+[а-яёa-z]{2,6}(/([а-яё\w\-\.]*[а-яё\w\-/]{1})*(\?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?(&(amp;)?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?)*)?)?#ui";
  echo 
$str preg_replace_callback$pattern 'getURL' $str );
?>

Наверно все-таки нужно использовать функции по назначению.... И если придумали preg_replace_callback, значит вызов функций в preg_replace не очень-то и предусмотрен )))

  Ответить  
 
 автор: Sfinks   (28.02.2012 в 10:54)   письмо автору
 
   для: Sfinks   (28.02.2012 в 10:11)
 

Понял почему у вас происходило то что происходило.
В функцию передается не то что скрыто под $0, а именно "$0". Поэтому длина строки всегда равна 2, и функция возвращает строку '<a href="$0">$0</a>', и вот она уже использовалась для подстановки в preg_match();

  Ответить  
 
 автор: Z3RO   (28.02.2012 в 13:39)   письмо автору
 
   для: Sfinks   (28.02.2012 в 10:54)
 

Спасибо. Сейчас попробую. Я же писал, кстати, что передается именно $0, а не его значение. :)

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

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