Помогите с лехким регулярным выражением, я их не умею.

Прислано: MAMONT

пн, 21/01/2008 - 14:34

Другие статьи по теме:

Есть строка $text = preg_replace('/<a([^>]+)>/i', '<a\\1 rel="nofollow">', $text);
мне нужно написать обратную, что бы вырезать rel="nofollow".

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

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано PVasili в пн, 21/01/2008 - 14:56.

А просто заменой? На сколько я понял твоя режет только символы )"
Советую http://www.regexbuddy.com/ или есть аналогичные online сервисы


Опубликовано PVasili в пн, 21/01/2008 - 15:00.

Ну вот хотя бы http://www.cuneytyilmaz.com/prog/jrx/


Опубликовано mlarini в пн, 21/01/2008 - 15:05.

Что-то типа этого, вроде не ошибся:

$text=("/\\s+rel=(\"|')nofollow(\"|')/i", '', $text);


Опубликовано MAMONT в пн, 21/01/2008 - 15:36.

Мне именно в линках надо вырезать, остальной текст не трогать. Спасибо за ссылки, может там найду искомое.


Опубликовано MAMONT в пн, 21/01/2008 - 15:44.

Знаете, посмотрел ссылки, я как новичек в этом вышел с тех страниц в еще больших непонятках.
Но кое что сформулировал за это время.

1. Мне надо найти все ссылки в которых нет никакого rel и втавить туда rel="nofollow"
2. Пройтись по всем ссылках, и где присутсвует rel="follow" заменить на пустое.

Это для того что бы для всех ссылок сайта сделать rel="nofollow", но редактор и посвященные люди могли дописывать rel="follow", которое в итоге в фильтре убивает rel="nofollow".

Можно 2 строчки, не обезательно одно рег. выр.


Опубликовано mlarini в пн, 21/01/2008 - 15:50.

Тогда примерно так (по удалению rel=):

$text=preg_replace("/<a([^>]+)\\s+rel=(\"|')nofollow(\"|')/i", "\\1", $text);


Опубликовано MAMONT в пн, 21/01/2008 - 15:56.

для пункта 2 выражение следующее
preg_replace('/<a(.*?)(rel="follow")(.*?)>/i','<a\\1\\3>',$text);

осталось первое родить, но не умею.


Опубликовано MAMONT в пн, 21/01/2008 - 15:50.

не знаю как тут код вставлять, сильно ломается всё ((


Опубликовано magway в пн, 21/01/2008 - 16:57.

Для написания регекспов пользуюсь софтинкой Regex Coach. Имхо, очень удобная. Там же, на сайте, есть мануал по ней (на английском).
.


Опубликовано Valeratal в пн, 21/01/2008 - 18:11.

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


Опубликовано PVasili в пн, 21/01/2008 - 18:57.

Примерчик можно взглянуть, где 2 раза? Только с условием, что он корректно работает... ;)


Опубликовано Valeratal в вт, 22/01/2008 - 06:46.

1. Мне надо найти все ссылки в которых нет никакого rel и втавить туда rel="nofollow"
2. Пройтись по всем ссылках, и где присутсвует rel="follow" заменить на пустое.

вот написано как два раза :)

или нужно рассказать как (например в дримвьюере) выполнить замену?


Опубликовано PVasili в вт, 22/01/2008 - 09:05.

"дримвьюере" присутствует в поставке drupal? Или он может в динамическом контенте это делать. Короче - примера нет...


Опубликовано MAMONT в вт, 22/01/2008 - 09:05.

> чесслово не понял а почему нельзя просто поиск и замена?
потому что только в ссылках дописывать или чистить надо, в остальных тегах и просто в тексте не трогаем.

Для пункста 2 выражение мне написали, которое работает, для первого пункта осталось. Помогите кто чем сможете )

Всем спасибо, кто приложился.

Пойду поизучаю сайт Regex Coach


Опубликовано PVasili в вт, 22/01/2008 - 09:25.

Может картинку в подписи уберем?


Опубликовано MAMONT в вт, 22/01/2008 - 10:00.

Угу, можно, давно собирался. И другим мешает?:)


Опубликовано MAMONT в вт, 22/01/2008 - 10:48.

Если кто то хочет помочь, постучитесь в icq 1331818. или yahoo onic2003. не знаю чем отблагодарить. номерок Аси 7 знаков но симпотный где то завалялся )) сроки жмут (( смотрел Regex Coach и подобные, они для отладки хороши, но не для тех кто в этом дуб-дерево ((

1. Требуется найти все ссылки в которых нет никакого rel= и втавить туда rel="nofollow"
2. Пройтись по всем ссылках, и где присутсвует rel="follow" заменить на пустое.
На выходе у нас все ссылки будут или с rel="nofollow" или без rel="follow".

Это для того что бы для всех ссылок сайта сделать rel="nofollow", за исключением тех где редактор дописал rel="follow", которое дает команду не вставлять rel="nofollow".

Решение:
1. (его еще нет)
2. $text = preg_replace('/<a rel="follow"([^>]+)>/i','<a \\1 >',$text); - это работает.

Если видите другой хороший вариант, я рассмотрю.


Опубликовано EliteMonk в вт, 22/01/2008 - 14:53.

Я не знаток регулярных выражений, понимаю их и могу написать простенькое, но любую задачу можно решить без них, они лишь для упрощения кода служат, плюс возможно иногда сложно написать быстро работающие алгоритмы, но данный случай как раз простой, код буду писать сейчас так сказать realtime, так что попробуйте разобраться в логике, и если где-то сделаю опечатку, поправте сами, )) Ну вот приступим:

не уверен на счёт правильности, но если автор 5 лет пишет регулярки оставте лучше это выражение ))
мой способ это найти все открывающие теги a проверить на есть ли там атрибут rel если нет выполнить первое задание, если rel есть и значение nofollow не трогаем в противном случае какое бы там значение не стояло удаляем без проверки. Впринципе ваше задание понял так должно быль либо nofollow либо не быть атрибута rel вообще... да и ещё предполагаю что поиск нужен был в переменной $content... + ещё подразумевается что атрибут rel может быть в теге единожды, технически-то можно написать и два раза........ если надо то можно додумать... так же если будет совпадение, в значение другого атрибута, то он обрежется, например, title="seper rel=10", обрежется именно rel=, я могу доработать код, но сначала проверь ;)

<?php
$tmpArr = explode('<a ', $content);
for ($i = 1; $i < count($tmpArr); $i++) {
    $tmpArr2 = explode('>', $content);
    if (eregi('rel=', $tmpArr2[0])) {
        $tmpArr3 = explode('rel=', $content);
        $tmpStrAtrb = substr($tmpArr3[1], strpos($tmpArr3[1], ' '));
        if (!eregi('nofollow', $tmpArr2[0])) {
            $tmpArr2[0] = str_replace(('rel=' . $tmpStrAtrb), '', $tmpArr2[0]);
        }
    } else {
        $tmpArr2[0] .= ' rel="nofollow" ';
    }
    $tmpArr[$i] = implode('>', $tmpArr2);
}
$content = implode('<a ', $tmpArr);
?>


Опубликовано EliteMonk в вт, 22/01/2008 - 14:58.

кстати лехким пишестя легким )) к тому же не думаю что оно легкое... но это однако только моё мнение ))


Опубликовано vadbars@drupal.org в вт, 22/01/2008 - 15:24.

Есть модуль http://drupal.org/project/nofollowlist
Он по "черному списку" расставляет nofollow, а по "белому" - убирает.


Опубликовано PVasili в вт, 22/01/2008 - 21:19.

Может кому поможет для самообразования: http://www.intuit.ru/department/se/regperl/


Новое на сайте