Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Не могу понять поведение preg_replace()

 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP
 
Автор Сообщение
AcetonKZ

Участник тусовки


Зарегистрирован: 22.11.2011
Сообщения: 208
Откуда: караганда

СообщениеДобавлено: Вт Янв 24, 2012 6:29 pm    Заголовок сообщения: Не могу понять поведение preg_replace()
Ответить с цитатой

понадобился код, который на входе имеет url а на выходе - массив ссылок, при чем, решил, что по ходу нужно дописать протокол http(s):// или весь домен, если ссылка относительна.
исходный код
Код:

<?php
//-----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------

function getmicrotime(){
   list($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}

function getdomen($url_str){
$url_partsl = parse_url($url_str);
return $url_partsl[scheme]."://".$url_partsl[host];
}

function getlinks($tu){
preg_match_all("/(?<=href\=\"|href\=\'|url\=\"|src\=\"|src\=\'|action\=\"|img\=\"|xmlns\=\"|profile=\"|url\(\")\S*?(?=\"|\"\>|\')/",file_get_contents("$tu"), $matches1);
return $matches1;
}

function getlinksclean($tu){
$url_partsl = parse_url($tu);
preg_match_all("/(?<=href\=\"|href\=\'|url\=\"|src\=\"|src\=\'|action\=\"|img\=\"|xmlns\=\"|profile=\"|url\(\")\S*?(?=\"|\"\>|\')/",file_get_contents("$tu"), $matchesl1);
echo "12\n";

$matchesl2=preg_replace("/^(\/\/)/",$url_partsl[scheme]."://", $matchesl1[0]);
print_r ($matchesl2[0]);
$matchesl1=preg_replace("/^(\/)/",getdomen($tu)."/", $matchesl2);
return $matchesl1;
}

function fwrite_str($file_handl, $str_to_write){
fwrite($file_handl, $str_to_write."\n");
}

function file_str($file_name){
return str_replace("\n","",file($file_name));
}


//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
$target_url = $_GET[url];         // получаем адресс
echo "<h7>URL = $target_url</h7></legend>";   // выводим его

$url_parts = parse_url($target_url);      //получаем части адреса
echo "function parse_url() \n";         //выводим их
print_r($url_parts);            //

$time_start = getmicrotime();

$matches= array_unique(getlinks($target_url));   //находим ссылки по адресу без дублирования

print_r ($matches[0]);

//$domen=$url_parts[scheme]."://".$url_parts[host];   
$domen=   getdomen($target_url);            //получаем имя домен

$f=fopen("gl_result.dat", "w+") or die("Cannot open file gl_result.dat");
$fa=fopen("gl_all_result.dat", "a+") or die("Cannot open file gl_all_result.dat");
flock($f,2);
flock($fa,2);
//fwrite($f,$target_url."\n");
foreach ($matches[0] as $ltw){
$ltw.="\n";

$ltw=preg_replace("/^(\/\/)/",$url_parts[scheme]."://", $ltw);
$ltw=preg_replace("/^(\/)/",$domen."/", $ltw);
fwrite_str($f, $ltw);               //записываем как строки
fwrite_str($fa, $ltw);               //

}

flock($fa,3);
fclose($fa);
print_r($domen."\n");

print_r (file_str('gl_result.dat'));
flock($f,3);
fclose($f);

echo "</fieldset>";
$time=getmicrotime()-$time_start;
echo "Все выполнено за $time секунды\n";

?>
</pre>

попытка собрать все preg_replace воедино в функцию getlinksclean()
терпит неудачу, возвращая ничего.
Если там, где в теле функции после эхо12\n
поставить print_r($matchesl1[0]) - все выводиться как надо(но без "дописок"). Если ставим print_r($matchesl2[0]) после первого preg_replace выводит совсем не то ,что должен. Такое ощущение ,что когда для preg_replace на входе строка - т овсе ок!, а когда массив - что то не то.
Что подскажете с незамыленым глазом, а то уже вторая ночь без сна пошла?
Понятно, что можно через цикл передавать элементы массива как строку и preg_replace править построчно, завтра на свежую голову попробую ,но хочу понять что я делал не так
Работоспособность кода до попытки собрать все в функцию можно проверить тут.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AcetonKZ

Участник тусовки


Зарегистрирован: 22.11.2011
Сообщения: 208
Откуда: караганда

СообщениеДобавлено: Вс Янв 29, 2012 5:45 pm    Заголовок сообщения:
Ответить с цитатой

Вроде разобрался Cool
Оказывается намудрил с многомерностью массивов.
preg_match_all возвращает многомерный массив, где возвращены все соответствия подшаблонам, а потом, после preg_replace уже идет одномерный массив.
уф! но оно того стоило Confused
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP Часовой пояс: GMT
Страница 1 из 1
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис