Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проверить ссылку

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
rafaello9
Отправлено: 15 Января, 2015 - 12:44:34
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Добрый день!
Есть массив из ссылок для проверки:
PHP:
скопировать код в буфер обмена
  1. $url_text = array(
  2.     'http://jghty.com',
  3.     'http://kgjtu.net',
  4.     'http://kfjfyt.org',
  5.     'http://nvhgy.jfhty.org'
  6. );

Надо проверить искомый текст на присутствие любой ссылки из $url_text.
Причем искомый текст может быть как txt-формате, так и в html-формате. Например:
PHP:
скопировать код в буфер обмена
  1. $iscomiy_text = '
  2. Вы получили это письмо, потому что
  3. подписались на рассылку .......
  4. ............................
  5. на сайте http://kgjtu.net/my-page/jfhgy.html
  6. ';

или
PHP:
скопировать код в буфер обмена
  1. $iscomiy_text = '
  2. <head></head>
  3. <body>
  4. <p>Вы получили это письмо, потому что</p>
  5. <p>подписались на рассылку .......</p>
  6. ............................
  7. <p>на сайте <a href="http://kgjtu.net/my-page/jfhgy.html">вот здесь</a></p>
  8. ';

Еще раз мой вопрос.
Как проверить $iscomiy_text на присутствие/отсутствие любой ссылки из массива $url_text ? Причем, ссылка в искомом тексте может иметь вид 'http://kgjtu.net/my-page/jfhgy.html',
а в массиве $url_text - 'http://kgjtu.net/'
 
 Top
GoDr
Отправлено: 15 Января, 2015 - 14:35:10
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




решение в лоб Радость

PHP:
скопировать код в буфер обмена
  1. $url_text = array(
  2.     'http://jghty.com',
  3.     'http://kgjtu.net',
  4.     'http://kfjfyt.org',
  5.     'http://nvhgy.jfhty.org'
  6. );
  7.  
  8. $iscomiy_text = '
  9.    Вы получили это письмо, потому что
  10.    подписались на рассылку .......
  11.    ............................
  12.    на сайте http://kgjtu.net/my-page/jfhgy.html
  13.    <head></head>
  14.    <body>
  15.    <p>Вы получили это письмо, потому что</p>
  16.    <p>подписались на рассылку .......</p>
  17.    ............................
  18.    <p>на сайте <a href="http://kgjtu.net/my-page/jfhgy.html">вот здесь</a></p>
  19.    ';
  20.  
  21. foreach($url_text as $value){
  22.     echo 'Адрес: <b>' . $value . '</b>. Число вхождений: <b>' . substr_count($iscomiy_text, $value) . '</b><br>';
  23. }

(Добавление)
результат:

Адрес: http://jghty.com. Число вхождений: 0
Адрес: http://kgjtu.net. Число вхождений: 2
Адрес: http://kfjfyt.org. Число вхождений: 0
Адрес: http://nvhgy.jfhty.org. Число вхождений: 0


-----
Система управления веб-содержимым Lotos CMS
 
 Top
rafaello9
Отправлено: 15 Января, 2015 - 16:26:35
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Просто СУПЕР!!!
Благодарю!
 
 Top
GoDr
Отправлено: 15 Января, 2015 - 19:35:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




rafaello9, это не самый лучший вариант... Нужно оптимизировать.. представь если ссылок много и текст большой..

Можно подумать, чтобы вытащить все ссылки из текста и уже потом этот маленький текст гонять...


-----
Система управления веб-содержимым Lotos CMS
 
 Top
rafaello9
Отправлено: 16 Января, 2015 - 05:54:21
Post Id


Новичок


Покинул форум
Сообщений всего: 28
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Я понимаю....
простите, а какой функцией можно вытащить все ссылки из $iscomiy_text ?
 
 Top
LIME
Отправлено: 16 Января, 2015 - 06:30:57
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Не надо ничего вытаскивать
Это еще накладнее получится
Можно регуляркой через | поискать если охота
 
 Top
GoDr
Отправлено: 16 Января, 2015 - 11:24:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




LIME пишет:
Не надо ничего вытаскивать
Это еще накладнее получится
ну не скажи.. Именно регуляркой вытащить только ссылки и уже в этом маленьком тексте искать что нужно. Регулярка пройдёт только один раз огромный текст, а дальше будет легко и быстро..

LIME пишет:
Можно регуляркой через | поискать если охота
Боюсь что если ссылок будет очень много всё подвиснет... хотя нужно провести тест...

Если допустить следующие правила
- ссылка начинается с http
- ссылка заканчивается пробельным символом или кавычками
то код можно переделать так:
PHP:
скопировать код в буфер обмена
  1. preg_match_all("#(http://.*?)(\s|\'|\")#is", $iscomiy_text, $tmp);
  2. $str = implode(' ', $tmp[1]);
  3.  
  4. foreach($url_text as $value){
  5.     echo 'Адрес: <b>' . $value . '</b>. Число вхождений: <b>' . substr_count($str, $value) . '</b><br>';
  6. }


-----
Система управления веб-содержимым Lotos CMS
 
 Top
LIME
Отправлено: 16 Января, 2015 - 11:34:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Допуски для ссылки неправильные
Но отталкиватться действительно надо от размеров текста и массива
Только зачем? Надо?
 
 Top
GoDr
Отправлено: 16 Января, 2015 - 11:36:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




LIME, ты имеешь в виду что-то такое?
PHP:
скопировать код в буфер обмена
  1. $url = '\Q' . implode('\E|\Q', $url_text) . '\E';
  2. preg_match_all("#(" . $url . ")#is", $iscomiy_text, $tmp);

(Добавление)
LIME пишет:
Допуски для ссылки неправильные
да я не заморачивался, взял исключительно из условия задачи

(Отредактировано автором: 16 Января, 2015 - 11:38:22)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
LIME
Отправлено: 16 Января, 2015 - 11:40:35
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Хотя это по условиям начинается с http?
Закончится может еще открытием тега и теоретически любым запрещенным для ссылки символом
 
 Top
GoDr
Отправлено: 16 Января, 2015 - 11:55:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




Провёл маленький тест..

Сделал файл примерно 100000 срок (5,7Мб) с ссылками и мусором. Результат помещается в массив. Тесты проводил по несколько раз, брал минимальное и максимальное значение

код 1:
PHP:
скопировать код в буфер обмена
  1. $iscomiy_text = file_get_contents('1.txt');
  2.  
  3. $sysstart = microtime(true);
  4. $url = '\Q' . implode('\E|\Q', $url_text) . '\E';
  5. preg_match_all("#(" . $url . ")#is", $iscomiy_text, $tmp);
  6.  
  7. print(round((microtime(true) - $sysstart), 5));

код 2:
PHP:
скопировать код в буфер обмена
  1. $sysstart = microtime(true);
  2.  
  3. preg_match_all("#(http://.*?)(\s|\'|\")#is", $iscomiy_text, $tmp);
  4. $str = implode(' ', $tmp[1]);
  5. foreach ($url_text as $value) {
  6.     if(substr_count($str, $value)){
  7.         $a[] = $value;
  8.     }
  9. }
  10.  
  11. print(round((microtime(true) - $sysstart), 5));


Тест 1: $url_text содержит 4 ссылки
код 1: 0.046 - 0.054
код 2: 0.12101 - 0.13501

Тест 2: $url_text содержит 100 ссылок
код 1: 0.20601 - 0.22401
код 2: 0.20401 - 0.23001

Тест 2: $url_text содержит 1000 ссылок
код 1: 1.62609 - 1.6681
код 2: 0.96706 - 0.95905

(Отредактировано автором: 16 Января, 2015 - 12:09:49)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
LIME
Отправлено: 16 Января, 2015 - 12:05:30
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Не может 2ой тест быть быстрее 1го ну никак
 
 Top
GoDr
Отправлено: 16 Января, 2015 - 12:10:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




ошибочка закралась в первом тесте.. поправил

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

(Отредактировано автором: 16 Января, 2015 - 12:11:58)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
LIME
Отправлено: 16 Января, 2015 - 12:15:53
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




А с увеличение текста и/или ссылок в нем будет наоборот
Как всегда палка о двух концах
Это еще упрощенная регулярка для вырезки текста
(Добавление)
добавь окончание еще хоть на "<" вполне после текста ссылки может быть html
rafaello9 пишет:
Причем искомый текст может быть как txt-формате, так и в html-формате
непонятно могут ли быть ссылки просто текстом в html формате
еще сильно зависит от соотношения ссылок и остального текста
"#(" . $url . ")#is" скобки не нужны
(Добавление)
LIME пишет:
Это еще накладнее получится
а вообще под этим подразумевались ссылки в общем виде
в своем разнообразии))
 
 Top
GoDr
Отправлено: 16 Января, 2015 - 13:36:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




А вообще можно поставить "переключатель".. Используем код 1, начал тормозить - включаем код 2 Подмигивание

В итоге нужно знать конечную цель.. тогда уже и решение подстраивать

(Отредактировано автором: 16 Января, 2015 - 13:37:20)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB