|
|
|
| Задача - выловить из текста значения href всех ссылок.
Пробовал различные паттерны, в том числе и из этого форума, но все время была одна проблема:
паттерн не извлекает href без кавычек.
То есть ссылки вида href="test" и href='test' нормально обрабатывает, а вот href=test (без кавычек) - пропускает.
Помогите пожалуйста разобраться с проблемой, 3 часа уже над ней бьюсь. | |
|
|
|
|
|
|
|
для: depp
(24.02.2007 в 00:59)
| | Вы извлеките путь вместе с кавычками
"|<a href=([^\s>]+)[\s]*>|is"
|
А кавычки потом отрежте при помощи функции trim(). | |
|
|
|
|
|
|
|
для: depp
(24.02.2007 в 00:59)
| | Можно вот так попробовать
"#<a[^>]*href=['\"]?([^\"'\s>]+)['\"]?[^>]*>#is"
|
| |
|
|
|
|
|
|
|
для: kasmanaft
(24.02.2007 в 07:16)
| | Спасибо огромное, такой шаблон отлавливает почти все случаи. Кроме одного - когда одинарная кавычка встречается в адресе ссылки, типа href="foo'bar.php". В таких случаях адрес обрезается по ней. Пока нашел одно решение - перед проверкой паттерном заменять все одинарные кавычки по краям (но не внутри) ссылок знаком &.
$text=str_replace("'>","&>",$text);
$text=str_replace("' ","& ",$text);
$text=str_replace("='","=&",$text);
|
Это работает, но чую, что можно сделать это и в самом регэкспе. Вот только как? | |
|
|
|
|
|
|
|
для: depp
(24.02.2007 в 11:46)
| | Ну вообще-то кавычек не должно быть в ссылках, urlencode их заменяет на %22 и %27.
А если уж Вы решили заменять их на & (который вполне может встретиться посреди ссылки), то лучше воспользоваться советом cheops'a, потому как мое рег. выражение в таком случае вообще теряет смысл.
____________________
Хм, придумал кое-что для такого случая (ссылка попадает во вторую скобку):
"#<a[^>]*href=(['\"])?(((?!(\\1|\s|>)).)+)\\1?[^>]*>#is"
|
| |
|
|
|
|
|
|
|
для: 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";
|
Однако преклоняюсь перед мастерством, если тот шаблон я еще понял, то в этот "въехать" так и не смог ) | |
|
|
|