Шаблоны строк

Алексей_N

Новичок
Шаблоны строк

Есть скрипт, который ищет обратную ссылку на сайт.
обратная ссылка составляется по шаблону:
$koddr='(<a[^>]*href=[\'\" ]?http://[w.]*'.$kodd.'[\'\" ]?)';
где $kodd к примеру равен www.mysait.ru

т.е. вот эта ссылка найдется:
<a href="http://www.mysait.ru">mysait.ru</a>

Но ссылки могут выглядеть и писать некоторыми вот так например:
<a href= "http://www.mysait.ru ">mysait.ru</a>

Т.е. в свой шаблон я не могу заложить пробелы например перед '=' или перед ' " '.
Что ещё надо включить шаблон чтобы учесть такие пробелы???
Перекопал очень много материала но так и не нашел:(
 

ilkz

Новичок
Есть класс символов \s - это всякие пробельные, переносы строк. Также, наверное, можно использовать hex-код пробела.
 

Алексей_N

Новичок
Автор оригинала: ilkz
Есть класс символов \s - это всякие пробельные, переносы строк. Также, наверное, можно использовать hex-код пробела.
Так в том то и дело что пробела может и не быть....
 

ilkz

Новичок
ну так поставь его как "\s?" (без кавычек). Это означает, что он либо есть, либо его может и не быть.
 

Алексей_N

Новичок
Автор оригинала: ilkz
ну так поставь его как "\s?" (без кавычек). Это означает, что он либо есть, либо его может и не быть.
Ты имеешь в виду вот эту строчку?
$koddr='(<a[^>]*href\s?=\s?[\'\" ]?\s?http://[w.]*'.$kodd.\s?'[\'\" ]?)';

Она не работает...
Или я что не так написал?
 

Алексей_N

Новичок
Автор оригинала: white phoenix
Что значит обратную ссылку на сайт? Скажи словами что нужно.
Есть скрипт каталога ссылок для обмена ссылками. Основное условие каталога в том что человек который хочет добавить ссылку в каталог должен поставить обратную ссылка на каталог и указать путь где находится ссылка на каталог. Скрипт в автоматическом режиме ищет на этой указанной странице ссылку на каталог. Каким образом скрипт каталога составляет ссылку на себя (на каталог). Именно по средством вот этого шаблона. В нем и проблема.
 

ksnk

прохожий
PHP:
$kodr="mysite.ru" ; 
$s='...<a ... href="http://www.mysite.ru"> Сайт </a>...';
if (preg_match('~<a[^>]*href\s*=.[^>=]*'.$kodr.'~i',$s))
 echo "Есть!" ;
else
 echo "Нет!" ;
Такой код проверит - есть ли в строке S ссылка на сайт mysite.ru.
 

white phoenix

Новичок
Как вариант:
PHP:
function x_array_merge($arr1,$arr2)
{
 if (!is_array($arr1)) {$arr1 = array();}
 if (!is_array($arr2)) {$arr2 = array();}
 $arr = array();
 for ($i=0;$i<count($arr1);$i++) {$arr[$i]=($arr1[$i] == '')?$arr2[$i]:$arr1[$i];}
 return $arr;
}
function get_links(&$body)
{
 $pattern  = "/((@import\s+[\"'`]([\w:?=@&\/#._;-]+)[\"'`];)|";
 $pattern .= "(:\s*url\s*\([\s\"'`]*([\w:?=@&\/#._;-]+)";
 $pattern .= "([\s\"'`]*\))|<[^>]*\s+(src|href|url)\=[\s\"'`]*";
 $pattern .= "([\w:?=@&\/#._;-]+)[\s\"'`]*[^>]*>))/i";
 preg_match_all($pattern,$body,$matches);
 if (is_array($matches)) {$links = x_array_merge($matches[3],x_array_merge($matches[5],$matches[8]));}
 else {$links = array();}
 return $links;
}
Получишь все ссылки, а там уже обработай. Но всё ничего не значит, т.к. может быть ссылка будет не видна, например невидимый div сделают, а в нем ссылка.
 

Алексей_N

Новичок
Блин, может кто-нибудь объяснить почему вот эта строка не работает:

$koddr='(<a[^>]*href\s?=\s?[\'\" ]?\s?http://[w.]*'.$kodd.'\s?[\'\" ]?)';
 

white phoenix

Новичок
Алексей_N
Код работает, обычное объявление переменной. Приведи весь пример и приучись оформлять код через [ php ].
 

Алексей_N

Новичок
Автор оригинала: white phoenix
Алексей_N
Код работает, обычное объявление переменной. Приведи весь пример и приучись оформлять код через [ php ].
Дело в том что код не выполняет свою функцию. Т.е. если например перед "=" есть пробел - такая ссылка не засчитается.
 

white phoenix

Новичок
Алексей_N
Ты уверен?
PHP:
<?php
$koddr='(<a[^>]*href\s?=\s?[\'\" ]?\s?http://[w.]*'.$kodd.'\s?[\'\" ]?)';
?>
Работает именно так как и должен. Приведи весь кусок кода.
 

Алексей_N

Новичок
Вот сам кусок

<?php
$koddr='(<a[^>]*href\s?=\s?[\'\" ]?\s?http://[w.]*'.$kodd.'\s?[\'\" ]?)';
if(eregi($koddr,$strsum,$urlback)){$urpos=1;}
?>

Соответственно если urpos=1 - ссылка найдена.

-~{}~ 14.01.06 18:08:

Автор оригинала: white phoenix
Лучше \s*, т.к. пробел может быть не один.
надо вместо \s использовать [:space:]*

Тогда все работает!!!
Всем спасибо.!
 

white phoenix

Новичок
Алексей_N
> eregi
Ключевое слово.
UPD: я из тебя клещами вытаскивал кусок кода вместе с вызовом функции, откуда мы знаем preg или ereg у тебя там, а может еще что-то напутал.
 

ilkz

Новичок
ereg* - это для POSIX-совместимых регулярных выражений,
preg* - это для PCRE-совместимых рег. выр-ний. А это очень различные по синаксису конструкции. Сначала лучше определись, что именно тебе нужно.
зы: на мой взгляд, PCRE - гораздо мощнее и удобнее, чем ROSIX. К тому же, они и покороче будут :)
 
Сверху