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

Главные вкладки

Аватар пользователя MAMONT MAMONT 21 января 2008 в 17:34

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

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

Комментарии

Аватар пользователя MAMONT MAMONT 21 января 2008 в 18:36

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

Аватар пользователя MAMONT MAMONT 21 января 2008 в 18:44

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

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

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

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

Аватар пользователя MAMONT MAMONT 22 января 2008 в 12:05

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

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

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

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

Аватар пользователя Valeratal Valeratal 22 января 2008 в 9:46

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

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

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

Аватар пользователя PVasili PVasili 22 января 2008 в 12:05

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

Аватар пользователя MAMONT MAMONT 22 января 2008 в 13: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 EliteMonk 22 января 2008 в 17:53

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

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

<?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);
?>