Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите плиз с отловом ссылок
 
 автор: depp   (24.02.2007 в 00:59)   письмо автору
 
 

Задача - выловить из текста значения href всех ссылок.

Пробовал различные паттерны, в том числе и из этого форума, но все время была одна проблема:
паттерн не извлекает href без кавычек.
То есть ссылки вида href="test" и href='test' нормально обрабатывает, а вот href=test (без кавычек) - пропускает.
Помогите пожалуйста разобраться с проблемой, 3 часа уже над ней бьюсь.

   
 
 автор: cheops   (24.02.2007 в 02:26)   письмо автору
 
   для: depp   (24.02.2007 в 00:59)
 

Вы извлеките путь вместе с кавычками
"|<a href=([^\s>]+)[\s]*>|is"

А кавычки потом отрежте при помощи функции trim().

   
 
 автор: kasmanaft   (24.02.2007 в 07:16)   письмо автору
 
   для: depp   (24.02.2007 в 00:59)
 

Можно вот так попробовать

"#<a[^>]*href=['\"]?([^\"'\s>]+)['\"]?[^>]*>#is"

   
 
 автор: depp   (24.02.2007 в 11:46)   письмо автору
 
   для: kasmanaft   (24.02.2007 в 07:16)
 

Спасибо огромное, такой шаблон отлавливает почти все случаи. Кроме одного - когда одинарная кавычка встречается в адресе ссылки, типа href="foo'bar.php". В таких случаях адрес обрезается по ней. Пока нашел одно решение - перед проверкой паттерном заменять все одинарные кавычки по краям (но не внутри) ссылок знаком &.


  $text=str_replace("'>","&>",$text);
  $text=str_replace("' ","& ",$text);
  $text=str_replace("='","=&",$text);


Это работает, но чую, что можно сделать это и в самом регэкспе. Вот только как?

   
 
 автор: kasmanaft   (24.02.2007 в 15:53)   письмо автору
 
   для: depp   (24.02.2007 в 11:46)
 

Ну вообще-то кавычек не должно быть в ссылках, urlencode их заменяет на %22 и %27.
А если уж Вы решили заменять их на & (который вполне может встретиться посреди ссылки), то лучше воспользоваться советом cheops'a, потому как мое рег. выражение в таком случае вообще теряет смысл.
____________________
Хм, придумал кое-что для такого случая (ссылка попадает во вторую скобку):
"#<a[^>]*href=(['\"])?(((?!(\\1|\s|>)).)+)\\1?[^>]*>#is"

   
 
 автор: depp   (24.02.2007 в 17:55)   письмо автору
 
   для: kasmanaft   (24.02.2007 в 15:53)
 

Спасибо за помощь, но опробовав ваш шаблон понял, что


  $text=str_replace(Array("'>","' ","='"),Array("$>","$ ","=$"),$text);
  $pattern = "#<a[^>]*href=[$\"]?([^\"$\s>]+)[$\"]?[^>]*>#is";


(амперсанд заменил на $, которого точно в ссылке не будет, спасибо за подсказку)

работает в среднем процентов на 10 быстрее, чем


 $pattern = "#<a[^>]*href=(['\"])?(((?!(\\1|\s|>)).)+)\\1?[^>]*>#is";


Однако преклоняюсь перед мастерством, если тот шаблон я еще понял, то в этот "въехать" так и не смог )

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования