Замена слова вне ссылки или alt

M
На сайте с 21.07.2005
Offline
70
781

Может кто-то подсказать как можно

preg_replace("#слово#", "<u>слово</u>", $text);

заставить не заменять "слово", если оно находиться в ссылке (в качестве куска url'a или в title) или в картинке (опять таки в ссылке или же в alt'е) ?

Или тут каким-то более-менее простым условием не обойтись и нужно заменять сначала ссылки\картинки на какую-то муть (попутно занося в массив, где что лежало), делать замену нужного слова, после чего восстанавливать на прежних местах ранее вырезанное? :(

Коля Дубр
На сайте с 02.03.2005
Offline
153
#1

Не совсем понял =)

Но обычно, когда одним регекспом разобраться не получается (или лениво) - функция preg_replace_callback() помогает отцу русской демократии =)

Разрабатываю общую шину (http://habrahabr.ru/company/floxim/blog/268467/) помаленьку. ...а еще у меня есть бложек (http://www.blogovo.ru/).
M
На сайте с 21.07.2005
Offline
70
#2
Но обычно, когда одним регекспом разобраться не получается (или лениво) - функция preg_replace_callback() помогает отцу русской демократии =)

спасибо :) завтра буду пробовать анализировать в отдельной ф-и близкие от елочки (см. ниже) слова (насколько я понял именно к такому алгоритму подталкивает этот колбек, или я не так понял?)

Не совсем понял =)

попробую обьяснить на примере

$text = "<p>В лесу родилась elochka, в лесу она росла <img src=\"/elochka.jpg\" alt=\"elochka\"> <br> зимой и летом стройная, веселая <a href="http://site.ru/elochka/index.html">elochka</a> была</p> <p>(Такая вот рагульная песенка про elochka). Как Вам наша elochka?</p>";

нада получить

$text = "<p>В лесу родилась <u>elochka</u>, в лесу она росла <img src=\"/elochka.jpg\" alt=\"elochka\"> <br> зимой и летом стройная, веселая <a href="http://site.ru/elochka/index.html"><u>elochka</u></a> была</p> <p>(Такая вот рагульная песенка про <u>elochka</u>). Как Вам наша <u>elochka</u>?</p>";

не нада получить (то, что получается при использовании одного прега с простейшим условием)

$text = "<p>В лесу родилась <u>elochka</u>, в лесу она росла <img src=\"/<u>elochka</u>.jpg\" alt=\"<u>elochka</u>\"> <br> зимой и летом стройная, веселая <a href="http://site.ru/<u>elochka</u>/index.html"><u>elochka</u></a> была</p> <p>(Такая вот рагульная песенка про <u>elochka</u>). Как Вам наша <u>elochka</u>?</p>";

zhitov
На сайте с 30.01.2005
Offline
219
#3
preg_replace("# elochka#", "<u>elochka</u>", $text);

А если пробел перед elochka? (Сам не пробовал, да и не програмист я)

Строительные калькуляторы ( https://www.zhitov.com/ )
M
На сайте с 21.07.2005
Offline
70
#4

не , к сожалению такой вариант не проходит, ибо в тексте может быть и <img src="ссылка" alt="супер elochka однозначно"> :(

Коля Дубр
На сайте с 02.03.2005
Offline
153
#5

Mitos, я бы сделал так. Коряво, но быстро =)


$text = "Песня про elochka: <p>В лесу родилась elochka, в лесу она росла <img src=\"/elochka.jpg\" alt=\"elochka\"> <br> зимой и летом стройная, веселая <a href=\"http://site.ru/elochka/index.html\">elochka</a> была</p> <p>(Такая вот рагульная песенка про elochka). Как Вам наша elochka?</p>";
function recall($matches) {
$repl = str_replace("elochka", "<u>elochcka</u>", $matches[1]);
return preg_replace("/".preg_quote($matches[1], '/')."$/", $repl, $matches[0]);
}
$result = preg_replace("/^<drop>/", '', preg_replace_callback("/<[^>]+>([^<]*)/", 'recall', "<drop>".$text));
echo htmlspecialchars($result);

Т.е. в функцию передается массив из 2х строк -

1) тег+то что за ним (все вхождение)

2) только то что за ним (первая подмаска)

Дальше логика такая:

1) Делаем замену во второй строке (т.е. в тексте без тега), сохраняем в $repl;

2) Поскольку вторая строка точно входит в первую, находим ее внутри первой и заменяем на $repl, не забыв проверить, что вхождение находится в конце (иначе в последовательности <a href="http://site.ru/elochka/index.html">elochcka произошла бы замена и внутри атрибута)

3) Возвращаем результат, коим заменяется полное вхождение

Ну, и хитрость с "<drop>" - добавляем его, чтоб строка гарантированно начиналась с тега (чтоб обработалась часть строки до первого тега), потом, соответственно, удаляем.

Вообще, подозреваю, что можно сделать и в один регексп, но это надо думать +)

M
На сайте с 21.07.2005
Offline
70
#6

Коля Дубр, спасибо :) Все работает замечательно

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий