[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: запретить замену слов в определенных тегах
asciibit
привет ребята. такой вопрос, например есть текст:

$text = "<p> <h1>привет народ</h1>привет народ</p>"


нужно произвести замену слова только между тегами <p> не заменяя при этом слово во всех других вложенных тегах.




Спустя 5 минут, 5 секунд (9.11.2009 - 14:11) glock18 написал(а):
что нужно заменить и что должно получиться?

Спустя 5 минут, 31 секунда (9.11.2009 - 14:17) asciibit написал(а):
заменить слово привет например на здравствуйте , только между тегами <p>
не заменяя привет в <h1>

Спустя 29 минут, 17 секунд (9.11.2009 - 14:46) glock18 написал(а):
1. может и не очень коротко, зато наиболее верно - проходить посимвольно.
2. preg_split'ом разбить строку по шаблону '#</?.*?>#'. пройти всем элементам результата и проверяя разделитель (юзать флаг PREG_SPLIT_DELIM_CAPTURE) str_replace'ом заменять строки в нужным элементах разбивки. если разделитель <p> - начинаем поиск слов. если после него другой тег - увеличиваем счетчик вложенных тегов и прекращаем поиск. если разделитель - закрывающий тег, то счетчик уменьшаем, и если он становится равным 0, продолжаем поиск в текущем элементе разбивки. и т.д.

Спустя 6 минут, 15 секунд (9.11.2009 - 14:52) asciibit написал(а):
что то более менее проясняется
а показать пример с кодом можешь?

Спустя 50 минут, 15 секунд (9.11.2009 - 15:42) glock18 написал(а):
не показываю. показывай что сделал, тогда комментариями помочь могу.

Спустя 8 часов, 46 минут, 35 секунд (10.11.2009 - 00:29) asciibit написал(а):

<?php
$text = "<p> <h1>привет народ</h1>привет народ</p>";
$keyword = array("привет");
$replace = array("здраствуйте");
$count_key = count($keyword);
if ($count_key != count($replace)) {
echo "Ошибка";
exit;
}
preg_match_all('#(?sad.gif<[^>]*?>)|^)([^<]*)#', $text, $arr, PREG_PATTERN_ORDER);
$str = "";
$flag = 0;
$count = count($arr[0]);
for ($i=0; $i<$count; $i++) {
$str .= $arr[1][$i];
if (!preg_match("#(^<h1)#i", $arr[1][$i])) {
if (preg_match("#(^</h1>)#i", $arr[1][$i])) {
$flag = 0;
}
if (strlen($arr[2][$i])>0 && $flag == 0) {
for ($j=0; $j<$count_key; $j++) {
$arr[2][$i] = f_str_replace($keyword[$j], $replace[$j], $arr[2][$i]);
}
}
}

else {
$flag = 1;
}
$str .= $arr[2][$i];
}
echo ($str);
function f_str_replace($key, $rep, $stroka) {
$pattern = "#(?<=\s|^|[>\"'-])" . $key . "(?=\s|$|[,.?!<\"'-])#si";
return preg_replace($pattern, $rep, $stroka);
}
?>


попробовал вот так, вроде работает, но почему то терзают сомнения

Спустя 3 минуты, 10 секунд (10.11.2009 - 00:32) asciibit написал(а):
preg_match_all('#(?: (<[^>]*?>)|^)([^<]*)#', $text, $arr, PREG_PATTERN_ORDER);

там где смайлик
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.