Помогите с лехким регулярным выражением, я их не умею.
Прислано: MAMONT
пн, 21/01/2008 - 14:34
Есть строка $text = preg_replace('/<a([^>]+)>/i', '<a\\1 rel="nofollow">', $text);
мне нужно написать обратную, что бы вырезать rel="nofollow".
Помогите если знаете. Я все собираюсь подучить рег.выр., но все как то время на это не хватает ((
- MAMONT's blog
- Для комментирования войдите или зарегистрируйтесь
А просто заменой? На сколько я понял твоя режет только символы )"
Советую http://www.regexbuddy.com/ или есть аналогичные online сервисы
- Для комментирования войдите или зарегистрируйтесь
Ну вот хотя бы http://www.cuneytyilmaz.com/prog/jrx/
- Для комментирования войдите или зарегистрируйтесь
Что-то типа этого, вроде не ошибся:
$text=("/\\s+rel=(\"|')nofollow(\"|')/i", '', $text);
- Для комментирования войдите или зарегистрируйтесь
Мне именно в линках надо вырезать, остальной текст не трогать. Спасибо за ссылки, может там найду искомое.
- Для комментирования войдите или зарегистрируйтесь
Знаете, посмотрел ссылки, я как новичек в этом вышел с тех страниц в еще больших непонятках.
Но кое что сформулировал за это время.
1. Мне надо найти все ссылки в которых нет никакого rel и втавить туда rel="nofollow"
2. Пройтись по всем ссылках, и где присутсвует rel="follow" заменить на пустое.
Это для того что бы для всех ссылок сайта сделать rel="nofollow", но редактор и посвященные люди могли дописывать rel="follow", которое в итоге в фильтре убивает rel="nofollow".
Можно 2 строчки, не обезательно одно рег. выр.
- Для комментирования войдите или зарегистрируйтесь
Тогда примерно так (по удалению rel=):
$text=preg_replace("/<a([^>]+)\\s+rel=(\"|')nofollow(\"|')/i", "\\1", $text);
- Для комментирования войдите или зарегистрируйтесь
для пункта 2 выражение следующее
preg_replace('/<a(.*?)(rel="follow")(.*?)>/i','<a\\1\\3>',$text);
осталось первое родить, но не умею.
- Для комментирования войдите или зарегистрируйтесь
не знаю как тут код вставлять, сильно ломается всё ((
- Для комментирования войдите или зарегистрируйтесь
Для написания регекспов пользуюсь софтинкой Regex Coach. Имхо, очень удобная. Там же, на сайте, есть мануал по ней (на английском).
.
- Для комментирования войдите или зарегистрируйтесь
чесслово не понял а почему нельзя просто поиск и замена?
ну да, 2 раза запускать придется, но делов то...
- Для комментирования войдите или зарегистрируйтесь
Примерчик можно взглянуть, где 2 раза? Только с условием, что он корректно работает... ;)
- Для комментирования войдите или зарегистрируйтесь
1. Мне надо найти все ссылки в которых нет никакого rel и втавить туда rel="nofollow"
2. Пройтись по всем ссылках, и где присутсвует rel="follow" заменить на пустое.
вот написано как два раза :)
или нужно рассказать как (например в дримвьюере) выполнить замену?
- Для комментирования войдите или зарегистрируйтесь
"дримвьюере" присутствует в поставке drupal? Или он может в динамическом контенте это делать. Короче - примера нет...
- Для комментирования войдите или зарегистрируйтесь
> чесслово не понял а почему нельзя просто поиск и замена?
потому что только в ссылках дописывать или чистить надо, в остальных тегах и просто в тексте не трогаем.
Для пункста 2 выражение мне написали, которое работает, для первого пункта осталось. Помогите кто чем сможете )
Всем спасибо, кто приложился.
Пойду поизучаю сайт Regex Coach
- Для комментирования войдите или зарегистрируйтесь
Может картинку в подписи уберем?
- Для комментирования войдите или зарегистрируйтесь
Угу, можно, давно собирался. И другим мешает?:)
- Для комментирования войдите или зарегистрируйтесь
Если кто то хочет помочь, постучитесь в 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); - это работает.
Если видите другой хороший вариант, я рассмотрю.
- Для комментирования войдите или зарегистрируйтесь
Я не знаток регулярных выражений, понимаю их и могу написать простенькое, но любую задачу можно решить без них, они лишь для упрощения кода служат, плюс возможно иногда сложно написать быстро работающие алгоритмы, но данный случай как раз простой, код буду писать сейчас так сказать 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); ?>
- Для комментирования войдите или зарегистрируйтесь
кстати лехким пишестя легким )) к тому же не думаю что оно легкое... но это однако только моё мнение ))
- Для комментирования войдите или зарегистрируйтесь
Есть модуль http://drupal.org/project/nofollowlist
Он по "черному списку" расставляет nofollow, а по "белому" - убирает.
- Для комментирования войдите или зарегистрируйтесь
Может кому поможет для самообразования: http://www.intuit.ru/department/se/regperl/
- Для комментирования войдите или зарегистрируйтесь







Комментарии