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
Форумы портала PHP.SU :: Версия для печати :: Вырезать ссылки
Форумы портала PHP.SU » PHP » Регулярные выражения » Вырезать ссылки

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

1. isle - 18 Декабря, 2010 - 11:32:47 - перейти к сообщению
Привет, форумчане. Никак не выходит вырезать ссылки из текста, кто знает, поскажите, пожалуйста, в чём ошибка.

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

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';
2. OrmaJever - 18 Декабря, 2010 - 16:47:25 - перейти к сообщению
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. isle - 18 Декабря, 2010 - 18:32:31 - перейти к сообщению
Спасибо за ответ. К сожалению, ваш пример мне не подойдет и ссылка на учебник мне не актуальна; php за год я достаточно хорошо освоил, но вот в конкретном своём вопросе запутался. Хочу разбить ссылки из текста на 3 части, чтоб разобрать левую (проверить ссылки на индексируемсть) и центральную часть, чтоб подсветить ключ. Дело в том, что в JS ссылки пишутся так: < \/ a >, поэтому их вытащить из HTML нельзя вашим способом, а мои способы не работают, либо корявым методом, который я в конце добавил.
4. JustUserR - 18 Декабря, 2010 - 19:31:06 - перейти к сообщению
isle В качестве возможного варината решения позволяющего осуществлять поиск и выбор требуемых элементов исходного HTML-кода допустмо использование расширений анализа XML-структур - дело в том что обработка корректного HTML-документа на основе объектной модели является в дейстивтельности более простой поскольку производится для представления элементов в оригинальном уровне
5. trot - 18 Декабря, 2010 - 19:54:28 - перейти к сообщению
Действительно коряво
6. OrmaJever - 18 Декабря, 2010 - 23:23:14 - перейти к сообщению
isle пишет:
Хочу разбить ссылки из текста на 3 части, чтоб разобрать левую (проверить ссылки на индексируемсть) и центральную часть

Мне так и не понятно что имено регуляркой нужно взять? На сылке не написано где первая часть, вторая и трейтяя. Приведите пример частей сылки и поможем разбить.
7. isle - 18 Декабря, 2010 - 23:29:18 - перейти к сообщению
В регулярках же указано Улыбка

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

Первые две части отдельно затем проверяю и подсвечиваю. Если посмотрите кусок кода, который привел в пример, то там 2 ссылки идут как одна, я их уже сделал недавно как 2 (добавил к первому сообщению), но, возможно, есть какое-то более "чистое" решение.
8. OrmaJever - 19 Декабря, 2010 - 00:14:30 - перейти к сообщению
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 пробелов нету, но в регулярках вы их указываете. Тоесть могут быть сылкис пробелами? Однако
9. isle - 19 Декабря, 2010 - 00:37:52 - перейти к сообщению
OrmaJever пишет:
Эдинственое я только понять не могу. В примере из первого поста между < и a пробелов нету, но в регулярках вы их указываете. Тоесть могут быть сылкис пробелами?


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

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

П.С. Спасибо за участие.
П.П.С. Эх, похоже, что регулярка не работает вообще так, пробовал и 2 и 3 слеша.
10. OrmaJever - 19 Декабря, 2010 - 00:46:31 - перейти к сообщению
isle пишет:
Ну, вебмастера разные бывают - застраховался просто... Несколько раз встречал, когда хитрыми программами пользуются и поэтому там могут быть переводы строк.
Ну простоя думал вам нужно парсить с ожного конкретного сайта. А на одном сайте обычно пишут одним стилем.
isle пишет:
Чтоб понять зачем это мне и как должно работать, вот кратенькое описание. Написал сервис для своих нужд, чтобы проверять как свои, так и чужие сайты на оптимизацию/SEO. Когда-то делал хороший сервис, теперь он сдох при переезде, решил с нуля опять его написать. Допустим заказчик просит посмотреть, что с его сайтом не так, я его чекаю и получаю все ссылки - битые/открытые и закрытые/левые и рекламные и т.д., затем уже лезу в шаблон и проверяю/редактирую... Когда HTML код длиною в километр и написан как попало, то гораздо удобнее видеть всё наглядно, где и что сломано на сайте

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


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

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

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


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

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

П.С. w3с не подходит, он показывает ошибки сайта, а мне нужно видеть уровень оптимизации, т.е. битые ссылки, внешние и внутренние ссылки, закрытые от поисковиков, левую рекламу на сайте и т.д., т.е. совсем другие задачи Улыбка
12. OrmaJever - 19 Декабря, 2010 - 01:18:16 - перейти к сообщению
isle пишет:
Если хотите, можете посмотреть в работе (только сегодня начал переписывать всё заново, поэтому не всё еще работает); выберите пункт "links" и укажите полную ссылку на свой сайт, получите список всех ссылок, например, у меня их 500, перебирать их вручную в коде смерти подобно... (сервис: isle-arch.ru).

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

мне кажется что проблемы с пхп. Ведь я проверял и у меня это работает. Вы пробовалина локалхосте тестить? Если хосте поставил ограничение загрузки скрипта в 30сек то мог ещё много чего запретить.
13. isle - 19 Декабря, 2010 - 01:53:10 - перейти к сообщению
К сожалению, локалка сдохла год назад из-за какого-то вируса, автор Денвера и авторы других виртуалок не в курсе как исправить это, поэтому тестю сразу онлайн. Буду тормошить своего хостера тогда, если завтра сам не разберусь, а то как-то странно, ошибок вообще никаких (ошибки включал), просто не работает и всё. Эх, каждую "запятую" скрупулёзно копать приходится... Огорчение

Спасибо за помощь; раз у вас работает, буду разбираться в чем проблема.
14. OrmaJever - 19 Декабря, 2010 - 12:52:48 - перейти к сообщению
isle пишет:
К сожалению, локалка сдохла год назад из-за какого-то вируса

ну дак скачайте снова денвер и установите)) Неужеле проще проверять каждый символ чем установить денвер и протестить?
15. isle - 19 Декабря, 2010 - 13:07:18 - перейти к сообщению
OrmaJever пишет:
ну дак скачайте снова денвер и установите


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

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

Спасибо за участие, пока хоть и коряво, но проблему решил.

 

Powered by ExBB FM 1.0 RC1