Замена в <a HREF

_vampiro_

Новичок
Замена в <a HREF

Входные данные: Строка, в которой много-много ссылок (<a href=......>)
Надо к каждой ссылке прицепить свои переменные. Если у кого есть исходник из php (где он сессии прилепляет) - буду благодарен...

Код:
/<a href=(.+?)\?(.+?)>/i
Знаю, что не верх совершенства, но частично это работает....
не обабатывает ссылки вида
<a href="" >

Может кто делал уже? Поиск юзал, может слова не те.
 

whirlwind

TDD infected, paranoid
если писать одной регуляркой, то это будет ужасно медленно. надо заюзать матч с коллбеком и передавать ему все, что между href= и закрывающей тэг скобкой.

/<a\s+href\s*=\s*[^>]*/

Уже внутри колбека разбирать линки, Ведь они могу быть и с пробелами, и без кавычек, и в апострофах.
 

_vampiro_

Новичок
а какая разница? пусть хоть в апострофах... мне ж надо вырезать просто до "?", если такой есть.

Кстати... от дурень... щас для <a href="" ..> отдельную наваяю регулярку и всего делов... :) Но если кто "адекватный" вариант кинет - пятку поцелую.
 

whirlwind

TDD infected, paranoid
>если такой есть

в этом вся загвоздка. Вам нужно

1. сначала выделить линк
2. определить есть ли в нем ?
3.а если есть ?, то конкат &myparam
3.б если нет ?, то конкат ?myparam

че то я не представляю себе как будет выглядеть 2 взаимозаменяемых условия в одном регэкспе.
ну попробуйте заюзать /ee для проверки последнего символа линка
 

_vampiro_

Новичок
та нифига.
PHP:
    echo preg_replace('|<a(.+?)href=(.+?)\?(.+?)>|i',
                  '<a\1href=\2'.'?a=1&'.'\3>',
                  '   <a   href="index.php?b=2" some=shit>  :)');
Абсолютно без разницы - есть"?" или нет.... оно не парсит "пустой" href.... вот в чем проблема.
 

whirlwind

TDD infected, paranoid
проблема в том, что Вы не хотите написать универсальное решение, потому что не хотите делить сложную задачу на подзадачи попроще :)

-~{}~ 10.02.06 16:05:

href=(.+?)\?(.+?)>

В каких случаях не попадает под условие? В случаях когда между href= и закрывающей > нет трех символов: любой символ, знак вопроса, любой символ. href=""> это последовательность двойная кавычка, двойная кавычка, т.е. 2 символа -> попадать не должно. что бы хавал пустые, надо

href=(.+?)\??(.+?)>
 

_vampiro_

Новичок
Лучшее - враг хорошего. Мне просто надо, чтобы работало. Причем желательно - быстро.

с пустым href не могу что-то сообразить, хоть str_replace пиши :)

-~{}~ 10.02.06 16:10:

Казалось бы правильно (я пробовал), но дает офигительный результат... неправильный, к сожалению.
 

whirlwind

TDD infected, paranoid
щас проверим

-~{}~ 10.02.06 16:16:

а, ну дак не слушаете меня.
1. сначала выделить линк
2. определить есть ли в нем ?
3.а если есть ?, то конкат &myparam
3.б если нет ?, то конкат ?myparam
п1 подразумевает, что в том, что выгребли может присутствовать левая инфа типа атрибутов тэга.

-~{}~ 10.02.06 16:19:

по этому следующим шагом после выцепления

/<a\s+href\s*=\s*([^>]*)/

назовем найденное A

является определение ограничителей строки ими являются

1. " если первый символ A это " или ', то линк завершается этим символом. Выдираем соответственно.
2. Если не первое, значит линк заканчивается пробелом. Ищем пробел.
3. Если пробел не нашли, то все полученное - линк

переходим к п2
 

_vampiro_

Новичок
я себе это на PREG не представляю... одним выражением по крайней мере.

Давай упростим задачу... как
<a\s+href="<сюда>"\s*>

вставить... если кавычки могут быть разными?
 

_vampiro_

Новичок
Излишне сложно. Проще отлавить такие ситуации и поправить ручками.... Пасиба! :beer:
 

white phoenix

Новичок
PHP:
function glue_url($parsed)
{
 if (!is_array($parsed)) {return '';}
 $uri = $parsed['scheme']?$parsed['scheme'].':'.((strtolower($parsed['scheme']) == 'mailto')?'':'//'): '';
 $uri .= $parsed['user']?$parsed['user'].($parsed['pass']? ':'.$parsed['pass']:'').'@':'';
 $uri .= $parsed['host']?$parsed['host']:'';
 $uri .= $parsed['port']?':'.$parsed['port']:'';
 $uri .= $parsed['path']?$parsed['path']:'';
 $uri .= $parsed['query']?'?'.$parsed['query']:'';
 $uri .= $parsed['fragment']?'#'.$parsed['fragment']:'';
 return $uri;
}
function replace_path($path)
{
 $params = 'sess=test';
 $i = parse_url($path);
 if (!$i) {$path = '?'.$params;}
 else
 {
  if (empty($i['query'])) {$i['query'] = $params;}
  else {$i['query'] .= '&'.$params;}
  return glue_url($i);
 }
}
function replace_callback($params)
{
 $params = str_replace("\'","'",$params);
 if (in_array($params{0},array('\'','"'))) {
  $params = preg_replace('~^([\'"])(.*?)\\1.*~e','"$1".replace_path("$2")."$1"',$params);
 }
 else {$params = preg_replace('~^(\S*)(.*)~e','replace_path("$1")."$2"',$params);}
 return $params;
}
$string = '<a href="" target>test</a>';
$result = preg_replace('~(<a.*?\shref=)(.*?)(>)~e','"$1".replace_callback("$2")."$3"',$string);
var_dump($result);
// string(29) "<a href="?sess=test">test</a>"
 

_vampiro_

Новичок
PHP:
$string = '<a href="" target>test</a>'; 
$result = preg_replace('~(<a.*?\shref=\s*)(.*?)(> )~e','"$1".replace_callback("$2")."$3"',$string); 
var_dump($result);
Код:
Content-type: text/html

X-Powered-By: PHP/4.3.10



string(26) "<a href="" target>test</a>"
) Смысл поста?
 

white phoenix

Новичок
_vampiro_
> string(26) "<a href="" target>test</a>"
Исправил код.
> Смысл поста?
Решение проблемы.
 

_vampiro_

Новичок
Понимаешь, в чем дело... 30 строк кода не решают обработку
<a href="" target>test</a>... ( Можешь попробовать.

-~{}~ 10.02.06 17:54:

не получается "<a href="?sess=test" target>test</a>"
 

_vampiro_

Новичок
о... Дайте две!
))

Работает! Протягивай пятку!!! (Наворочено, правда) Спасибо. :D
 

white phoenix

Новичок
> Наворочено, правда
Ну что ж делать... вслепую писал. Но если и можно оптимизировать, то не сильно.
 
Сверху