[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить необычный regex
soniclord
Здравствуйте!
В общем задача передо мной я поставил такую: все внешние ссылки с контента убрать КРОМЕ тех у которых есть id="linksss", но при выводе убирать id="linksss". Возможно ли сие реализовать и сколько потребуется regex'ов?

я нашел
<?
/**
* Получение внешних ссылок со страницы
*
*
@param html
*
@param домен (без www.)
*
@return массив внешних ссылок
*
*/

function getoutlinks($content, $domain)
{
$content = preg_replace("/[\n\r\t]/", '', $content); // Заменяем символы перевода строки и табуляции на пробел
$content = preg_replace("/[ ]{2,}/", ' ', $content); // Заменяем более 2х пробелов одним

preg_match_all("/<a[^<>]*href=['|\"](.*)['|\"][^<>]*>(.*)<\/a>/iU", $content, $links); // Собираем ссылки
if (sizeof($links[1]) > 0) // Если ссылки найдены
{
$out = array(); // Массив для внешних ссылок

foreach ($links[1] as $v)
{
if (preg_match("/http:\/\/(www\.){0,1}".$domain."/i", $v)) // Пропускаем внутренние ссылки
{
continue;
}

if (preg_match("/http:\/\/(www\.){0,1}(.*)/i", $v)) // Внешняя ссылка
{
$out[] = $v;
}
}


return $out;
}

return array();
}

- выводит все внешние ссылки, но как мне дописать все остальное?
p.s. я понимаю что каждый второй у вас спрашивает про регулярки, но не даются они мне...



Спустя 1 час, 40 минут, 27 секунд (3.12.2010 - 10:34) twin написал(а):
Не смущает то, что атрибут ID должен быть уникальным?
Другими словами на странице не может быть больше одной ссылки с id="linksss"?

Спустя 1 час, 31 минута, 16 секунд (3.12.2010 - 12:05) collapse написал(а):
twin хотел сказать что правильнее использовать class="linksss"

Спустя 23 минуты, 29 секунд (3.12.2010 - 12:29) twin написал(а):
Ну вот упростил маненько

function getoutlinks($content, $domain)
{

$out = array();

preg_match_all("#(<a[^>]*href=['|\"]http://(.*)['|\"][^<>]*>(.*)<\/a>)#iU", $content, $links);

foreach ($links[1] as $v)
if (strpos($v, $domain) == false && strpos($v, 'class="linksss"') !== false)
$out[] = str_replace('class="linksss"', '', $v);

return $out;
}



$text = '<a href="http://www.site.ru" class="linksss" >ссыль</a>'
.'<a href="http://www.site2.ru" class="linksss" >ссыль</a>'
.'<a href="http://www.site2.ru" >ссыль</a>';

print_r(getoutlinks($text, 'site.ru'));

Спустя 1 час, 27 минут, 36 секунд (3.12.2010 - 13:56) soniclord написал(а):
:rolleyes:
Спасибо! а есть ли вероятность такую ссылку оставить на ее месте, а не выковыривать?
т.е. просто тупо такие ссылки пропускать

наверное изначально неправильно сформулировал вопрос. мне бы хотелось все внешние ссылки вырезать, за исключением с классом class="linksss", их оставлять на месте.
для резалки всех внешних ссылок я яспользую
$text=preg_replace('|<a href="http://(.*?)"(.*?)>|is', "\\3", $text);  

Спустя 54 минуты, 10 секунд (3.12.2010 - 14:50) soniclord написал(а):
я допер, я допер!! :D
$text=preg_replace('|^<a href="http://(.*?)"\sclass="linksss">(.*?)</a>|is', "\\3", $text);  

Спустя 3 минуты, 40 секунд (3.12.2010 - 14:54) twin написал(а):
$domain = 'site.ru';

function getoutlinks($out)
{
global $domain;

if (strpos($out[0], $domain) === false && strpos($out[0], 'class="linksss"') !== false)
return str_replace('class="linksss"', '', $out[0]);

}



$text = 'текст <a href="http://www.site.ru" class="linksss" >ссыль</a>'
.'текст <a href="http://www.site2.ru" class="linksss" >ссыль</a>'
.'текст <a href="http://www.site3.ru" >ссыль</a>';

$text = preg_replace_callback("#<a[^>]*href=['|\"]http://(.*)['|\"][^<>]*>(.*)<\/a>#iU", 'getoutlinks', $text);

echo $text;
Всё, дальше сам думай. А то так ножки свесишь. :)

Спустя 57 секунд (3.12.2010 - 14:55) twin написал(а):
Уже сам сделал, молодца. smile.gif

Спустя 18 минут, 12 секунд (3.12.2010 - 15:13) soniclord написал(а):
twin, Благодарю! :-)

Спустя 2 часа, 42 минуты, 22 секунды (3.12.2010 - 17:55) Игорь_Vasinsky написал(а):
та.. а кто меня поднатаскает на регулярки??? user posted image

Спустя 1 день, 17 часов, 43 минуты, 46 секунд (5.12.2010 - 11:39) soniclord написал(а):
как думаете, эти 3 выражения сильно будут тормозить систему? может можно их как-то совместить?

$text=preg_replace('|<a href="http://(.*?)">(.*?)</a>|is', "\\2", $text);  
$text=preg_replace('|%"http://(.*?)"\s(.*?)%|is', "<a href=\"http://\\1\">\\2</a>", $text);
echo preg_replace("!</p><p>(.*?)</p>!si",'текст',$text,1);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.