Регулярные выражения

windoctor

Новичок
Регулярные выражения

Народ подскажите как сделать.
Нужно из ссылки <a _ class="copy" target=_blank href="http://blabla"> ну в общем всё вычистить и получить чистое <a _ href="http://blabla">

Заранее спасибо.
Если дадите ссылочки на статьи с удовольствием почитаю.
Спасибо
 

kamatoz

Новичок
2windoctor
обязательно почитай то, что написано по ссылке. Т.к. в случае со строкой <a _ target=_blank href="http://blabla" class="copy"> этот регэксп оставит class="copy" .
 

white phoenix

Новичок
kamatoz
Это рег. выражение решает предложенную задачку, если же надо чтобы и в конце удалялось, можно немного усложить его.
 

serglt

Анус, ой, Ахтунг
Мой вориант :) Может все кроме как когда в адресной строке есть пробел, если таких ситуяйцей не будет то в полне нормальное :)
$link = '<a class="fd saf" href=anus.com target="_blank">';

echo $str = preg_replace ("/<a.*href=([\'\"]?)([^\s]+)\\1.*>/", "<a href=\"\\2\">", $link);
 

white phoenix

Новичок
serglt
Я его немного доделал, единственный видимый недостаток - если ссылка вида href=link, т.е. без ограничивающих кавычек, то работает неправильно. Исправить это можно вот как: там где символьный класс [^\'"], нужно сделать подобие [^\1], при этом если \1 пустой, то \1 = \s. Т.е. если не указан ограничитель, то пробел.
PHP:
$link = '<a class="fd saf" href="link with 3 spaces" target=_blank>'; 
$str = preg_replace('~<(?:.*)href=([\'"]?)([^\'"]*)\1(?:.*)>~m','<a href=$1$2$1>',$link); 
echo $str; 
// <a href="link with 3 spaces">
UPD: немного оптимизировал
 

white phoenix

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

alan4ick

Guest
Есть еще вопрос по регулярным.

Можно ли при помощи регулярных выражений обрезать очень длинные слова до определенной длины ?
 

white phoenix

Новичок
alan4ick
Создал бы отдельную тему.
Можно ли при помощи регулярных выражений обрезать очень длинные слова до определенной длины ?
Конечно можно - читай [m]preg_replace[/m], задача настолько простая что я думаю ты справишься без помощи.
 

alan4ick

Guest
зачем создавать лишнии топики если и этот по регулярным выр.

это понятно, что делаем через preg_replace....стоп.... мда... детская задачка, а вводит в ступор...

надо было всего выпить сладкого чаю :))

вот, например режем больше 10 символов
echo preg_replace('/(\S{10})\S+/','\\1...',$text);

извиняюсь за глупейший вопрос ...
 

kamatoz

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

wordwrap
 

kamatoz

Новичок
white phoenix

почему? с ней нельзя "обрезать очень длинные слова до определенной длины"?
Использовать регэкспы там, где можно обойтись без них - это не по теме.
 

alan4ick

Guest
А как тогда при помощи рег. у некоторого тега вырезать все параметры кроме заданных?

-~{}~ 03.01.06 01:26:

white phoenix
- спасибо за хороший пример.

Теперь на твоем примере хочу сделать рег. выр для выдирания всех картинок, можно конечно вот так :

/<(?:a.*href|img.*src)=([\'"]?)([^\'"]*(?:jpe?g|gif|png))\1.*>/im

Но я хотел вначале сделать через "позитивный просмотр вперед" :

/<(?:.*)href=([\'"]?)([^\'"]*)(?=gif|jpe?g|png)\1(?:.*)>/im

но ничего не выходит. В чем ошибка во втором случае?
 

alan4ick

Guest
опережающая позитивная проверка... так понятно?
/<(?:.*)href=([\'"]?)([^\'"]*)(?=gif|jpe?g|png)\1(?:.*)>/im
 

SelenIT

IT-лунатик :)
В чем ошибка во втором случае?
Эта проверка задает не символы, а позицию, за которой должна следовать одна из указанных строк. И в то же время за этой же позицией должна следовать кавычка (из-за \1), что, конечно же, невозможно.
 
Сверху