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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Не разрезаются ссылки в JS и HTML
isle
Отправлено: 18 Декабря, 2010 - 11:32:47
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




Привет, форумчане. Никак не выходит вырезать ссылки из текста, кто знает, поскажите, пожалуйста, в чём ошибка.

Вот пример текста:

CODE (html):
скопировать код в буфер обмена
  1. <a rel='nofollow' href='http://click.hotlog.ru/?564274' target='_top'><img "+" src='http://hit28.hotlog.ru/cgi-bin/hotlog/count?"+hotlog_r+"&' border=0 width=88 height=31 alt=HotLog><\/a>")</script>
  2.                         <noscript><a rel="nofollow" href="http://click.hotlog.ru/?564274" target="_top"><img src="http://hit28.hotlog.ru/cgi-bin/hotlog/count?s=564274&im=134" border="0" width="88" height="31" alt="HotLog"></a>


Как видно из кода, здесь 2 ссылки. Вырезал разными вариантами - всё равно ссылки 2 в тексте, а должно быть по одной, т.е. делиться по: < / a> или по < \/ a>. Пробовал такие регулярки:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)(<\s*[\]?/[\s]*a\s*>)|smi';


CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)(<\s*[\\]?/[\s]*a\s*>)|smi';


CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)(<\s*[\\]?/[\s]*a\s*>)(?:<a\s+[^>]*>)?|smi';


и прочие аналоги, эх, никак не разбиваются...
(Добавление)
Опаньки! Сам что-то придумал Улыбка

Вот так заработала всё-таки, но мне такое решение кажется корявым:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)([\<\s\/]*/[\s]*a\s*>)(?:<a\s+[^>]*>)?|smi';
 
 Top
OrmaJever
Отправлено: 18 Декабря, 2010 - 16:47:25
Post Id



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


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


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




isle пишет:
Никак не выходит вырезать ссылки из текста, кто знает

Что значит вырезать? Совсем удалить их?
isle пишет:
Вот так заработала всё-таки, но мне такое решение кажется корявым:

А по проще не расматривали варианты? Если регулярка то это не значит чтонужно впихнуть все возможные символы.
PHP:
скопировать код в буфер обмена
  1. $str = '<a rel=\'nofollow\' href=\'http://click.hotlog.ru/?564274\' target=\'_top\'><img "+" src=\'http://hit28.hotlog.ru/cgi-bin/hotlog/count?"+hotlog_r+"&\' border=0 width=88 height=31 alt=HotLog></a>")</script>
  2. <noscript><a rel="nofollow" href="http://click.hotlog.ru/?564274" target="_top"><img src="http://hit28.hotlog.ru/cgi-bin/hotlog/count?s=564274&im=134" border="0" width="88" height="31" alt="HotLog"></a>';
  3.  
  4. preg_match_all('#<a(.+?)>(.+?)</a>#i', $str, $x);
  5. print_r($x[0]);


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
isle
Отправлено: 18 Декабря, 2010 - 18:32:31
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




Спасибо за ответ. К сожалению, ваш пример мне не подойдет и ссылка на учебник мне не актуальна; php за год я достаточно хорошо освоил, но вот в конкретном своём вопросе запутался. Хочу разбить ссылки из текста на 3 части, чтоб разобрать левую (проверить ссылки на индексируемсть) и центральную часть, чтоб подсветить ключ. Дело в том, что в JS ссылки пишутся так: < \/ a >, поэтому их вытащить из HTML нельзя вашим способом, а мои способы не работают, либо корявым методом, который я в конце добавил.

(Отредактировано автором: 18 Декабря, 2010 - 18:34:28)

 
 Top
JustUserR
Отправлено: 18 Декабря, 2010 - 19:31:06
Post Id



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


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


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




isle В качестве возможного варината решения позволяющего осуществлять поиск и выбор требуемых элементов исходного HTML-кода допустмо использование расширений анализа XML-структур - дело в том что обработка корректного HTML-документа на основе объектной модели является в дейстивтельности более простой поскольку производится для представления элементов в оригинальном уровне


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
trot
Отправлено: 18 Декабря, 2010 - 19:54:28
Post Id


Новичок


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


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




Действительно коряво
 
 Top
OrmaJever
Отправлено: 18 Декабря, 2010 - 23:23:14
Post Id



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


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


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




isle пишет:
Хочу разбить ссылки из текста на 3 части, чтоб разобрать левую (проверить ссылки на индексируемсть) и центральную часть

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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
isle
Отправлено: 18 Декабря, 2010 - 23:29:18
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




В регулярках же указано Улыбка

Нужно так: (< a >)(text)(< /a >)

Первые две части отдельно затем проверяю и подсвечиваю. Если посмотрите кусок кода, который привел в пример, то там 2 ссылки идут как одна, я их уже сделал недавно как 2 (добавил к первому сообщению), но, возможно, есть какое-то более "чистое" решение.
 
 Top
OrmaJever
Отправлено: 19 Декабря, 2010 - 00:14:30
Post Id



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


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


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




isle пишет:
Нужно так: (< a >)(text)(< /a >)

Ну вот вы этим примером практически написали регулярку))
Вот такой скромный пример берёт всё так как вам нужно.
PHP:
скопировать код в буфер обмена
  1. $str = '<a rel=\'nofollow\' href=\'http://click.hotlog.ru/?564274\' target=\'_top\'><img "+" src=\'http://hit28.hotlog.ru/cgi-bin/hotlog/count?"+hotlog_r+"&\' border=0 width=88 height=31 alt=HotLog><\/a>")</script>
  2.                        <noscript><a rel="nofollow" href="http://click.hotlog.ru/?564274" target="_top"><img src="http://hit28.hotlog.ru/cgi-bin/hotlog/count?s=564274&im=134" border="0" width="88" height="31" alt="HotLog"></a>';
  3. preg_match_all('#(<a(.+?)>)(.+?)(<(\\\)?/a>)#i', $str, $x);
  4. print_r($x[1]);
  5. print_r($x[3]);
  6. print_r($x[4]);

Эдинственое я только понять не могу. В примере из первого поста между < и a пробелов нету, но в регулярках вы их указываете. Тоесть могут быть сылкис пробелами? Однако


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
isle
Отправлено: 19 Декабря, 2010 - 00:37:52
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




OrmaJever пишет:
Эдинственое я только понять не могу. В примере из первого поста между < и a пробелов нету, но в регулярках вы их указываете. Тоесть могут быть сылкис пробелами?


Ну, вебмастера разные бывают - застраховался просто... Несколько раз встречал, когда хитрыми программами пользуются и поэтому там могут быть переводы строк.

Чтоб понять зачем это мне и как должно работать, вот кратенькое описание. Написал сервис для своих нужд, чтобы проверять как свои, так и чужие сайты на оптимизацию/SEO. Когда-то делал хороший сервис, теперь он сдох при переезде, решил с нуля опять его написать. Допустим заказчик просит посмотреть, что с его сайтом не так, я его чекаю и получаю все ссылки - битые/открытые и закрытые/левые и рекламные и т.д., затем уже лезу в шаблон и проверяю/редактирую... Когда HTML код длиною в километр и написан как попало, то гораздо удобнее видеть всё наглядно, где и что сломано на сайте Улыбка

П.С. Спасибо за участие.
П.П.С. Эх, похоже, что регулярка не работает вообще так, пробовал и 2 и 3 слеша.
 
 Top
OrmaJever
Отправлено: 19 Декабря, 2010 - 00:46:31
Post Id



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


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


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




isle пишет:
Ну, вебмастера разные бывают - застраховался просто... Несколько раз встречал, когда хитрыми программами пользуются и поэтому там могут быть переводы строк.
Ну простоя думал вам нужно парсить с ожного конкретного сайта. А на одном сайте обычно пишут одним стилем.
isle пишет:
Чтоб понять зачем это мне и как должно работать, вот кратенькое описание. Написал сервис для своих нужд, чтобы проверять как свои, так и чужие сайты на оптимизацию/SEO. Когда-то делал хороший сервис, теперь он сдох при переезде, решил с нуля опять его написать. Допустим заказчик просит посмотреть, что с его сайтом не так, я его чекаю и получаю все ссылки - битые/открытые и закрытые/левые и рекламные и т.д., затем уже лезу в шаблон и проверяю/редактирую... Когда HTML код длиною в километр и написан как попало, то гораздо удобнее видеть всё наглядно, где и что сломано на сайте

Ну это впринципе меняет суть дела. Тут так просто одной регуляркой не отделаешся.
1) Если вы собираетесь делать это всё вручную то можно посмотреть все ошибки страницы на http://validator[dot]w3[dot]org/ Там покажет все ошибки по стандарту html.
2) Если всётаки хотите собратьсвой скрипт похожий на w3с то тут нужно составить базу даных часто используемых html тегов.
(Добавление)
isle пишет:
П.П.С. Эх, похоже, что регулярка не работает вообще так, пробовал и 2 и 3 слеша.
вы про это? (\\\)?
Тут я сам не особо понял зачем нужно 3 слеша. Просто с 2 у меня написало что ')' заэкранизирована. Спас только 3 слеш.

(Отредактировано автором: 19 Декабря, 2010 - 00:48:22)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
isle
Отправлено: 19 Декабря, 2010 - 01:09:31
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




OrmaJever пишет:
вы про это? (\\\)?


Ага, эта конструкция не работает, перепробывал разные модификации уже. Хотелось бы упростить все регулярки и свести их до минимума, сейчас самые тяжёлые выключил. Ранее использовал несколько регулярок, лишь бы проще мне было, но сейчас некоторые новостные сайты содержат огромное кол-во ссылок и текста вообще, страницы до нескольких сотен кб доходят и это без графики (мега-статьи, ёлки). Поэтому выходить стало до 20-25 сек. на тяжёлую страницу, а 30 сек - ограничение хостера, вот и решил оптимизировать скрипты.

Вот это я придумал методом проб и ошибок, почему именно так - для меня самого является загадкой: нельзя ничего переделать, выкидываю хоть что-нибудь или переношу, регулярка не работает почему-то, поэтому все скобки квадратные и слеши стоят именно так:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $pattern = '|(<\s*a\s+[^>]*>)(.*?)([\<\s\/]*/[\s]*a\s*>)(?:<a\s+[^>]*>)?|smi';


Если можно упростить регулярку, то было бы супер - каждая секунда на счету Улыбка

Если хотите, можете посмотреть в работе (только сегодня начал переписывать всё заново, поэтому не всё еще работает); выберите пункт "links" и укажите полную ссылку на свой сайт, получите список всех ссылок, например, у меня их 500, перебирать их вручную в коде смерти подобно... (сервис: isle-arch.ru).

П.С. w3с не подходит, он показывает ошибки сайта, а мне нужно видеть уровень оптимизации, т.е. битые ссылки, внешние и внутренние ссылки, закрытые от поисковиков, левую рекламу на сайте и т.д., т.е. совсем другие задачи Улыбка
 
 Top
OrmaJever
Отправлено: 19 Декабря, 2010 - 01:18:16
Post Id



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


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


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




isle пишет:
Если хотите, можете посмотреть в работе (только сегодня начал переписывать всё заново, поэтому не всё еще работает); выберите пункт "links" и укажите полную ссылку на свой сайт, получите список всех ссылок, например, у меня их 500, перебирать их вручную в коде смерти подобно... (сервис: isle-arch.ru).

идея хорошая и реализировано довольно не плохо. Но вот только судяихэтой фразы:
isle пишет:
Эх, похоже, что регулярка не работает вообще так, пробовал и 2 и 3 слеша.

мне кажется что проблемы с пхп. Ведь я проверял и у меня это работает. Вы пробовалина локалхосте тестить? Если хосте поставил ограничение загрузки скрипта в 30сек то мог ещё много чего запретить.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
isle
Отправлено: 19 Декабря, 2010 - 01:53:10
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




К сожалению, локалка сдохла год назад из-за какого-то вируса, автор Денвера и авторы других виртуалок не в курсе как исправить это, поэтому тестю сразу онлайн. Буду тормошить своего хостера тогда, если завтра сам не разберусь, а то как-то странно, ошибок вообще никаких (ошибки включал), просто не работает и всё. Эх, каждую "запятую" скрупулёзно копать приходится... Огорчение

Спасибо за помощь; раз у вас работает, буду разбираться в чем проблема.
 
 Top
OrmaJever
Отправлено: 19 Декабря, 2010 - 12:52:48
Post Id



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


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


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




isle пишет:
К сожалению, локалка сдохла год назад из-за какого-то вируса

ну дак скачайте снова денвер и установите)) Неужеле проще проверять каждый символ чем установить денвер и протестить?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
isle
Отправлено: 19 Декабря, 2010 - 13:07:18
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


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




OrmaJever пишет:
ну дак скачайте снова денвер и установите


Вы, видимо, не поняли меня - сдохла локалка, не ставится и не работает Денвер! Автор посоветовал переустановить Виндоус, а для меня это смерти подобно... Кучу софта потом занова перерегистрировать через тырнет и почту, у меня же не пара ворованных утилит стоит.

Еще раз уточню: php не первый день изучаю, давно уже не актуальны мне эти уроки, почти уже весь сайт изучил php.net на англ. Про Денвер сам автор ничего сказать не может толком, вы полагаете, что я могу что-то придумать, прочитав его хелпы и переустановив? Радость Сто раз уже скачивал, всё чистил и переустанавливал - нифига. Вот и получается, что мне проще чем Вмнду всю перекапывать и переустанавливать, лучше онлайн у себя проверить.

Спасибо за участие, пока хоть и коряво, но проблему решил.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB