например есть такой текст фывфывфыв[*b]asdasdasd[a]sdasd[/a]sdasdas[*/b]фывфывфыв
и ты не хочешь чтобы в теге b что то менялось. Тогда ты его вырезаешь и ставишь вместо него хешь фывфывфыв{HASH_DH1FJDH74DJS84}фывфывфыв
Потом парсишь все что нужно и в конце опять заменяешь хешь на текст который был вырезан фывфывфыв[*b]asdasdasd[a]sdasd[/a]sdasdas[*/b]фывфывфыв
а что тут не ясного. Внутри временно вырезаного блока ничего не может замениться, ведь когда ты производишь замену он вырезан))) и заменен на какой то код, который потом ты точно сможешь узнать, что бы поставить этот фрагмент обратно
Добавлено 2010.11.30 14-38
Допустим есть строка я страшная строка с [*code]страшным [*b] текстом[*/b] и страшными[*/code] бб кодами
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<?php //находим все совпадения с нужным тегом
preg_match_all('#\[code\](.*)\[\/code\]#smi', $str, $match));
$count = count($match[1]);
$codeBox = array();
$codeUni = array();
//проходим по всем совпадениям. переменная $match содержит массив совпадений
for ($i = 0; $i < $count; $i++){
//заменяем тег code на то что нужно, например див
$codeBox[$i] = '<div>' . htmlspecialchars($match[1][$i]) . '</div>';
//создаем уникальный ключ для данного совпадения
$codeUni[$i] = 'code_' . md5(rand() . rand());
//заменяем совпадение ключом
$str = str_replace($match[0][$i], $codeUni[$i], $str);
}?>
Теперь у нас есть массив с ключами и еще один массив со строками соответствующими этим ключам. Ну и конечно у нас есть сама строка(основная) с которой можно делать че угодно не опасаясь повредить то что в тегах CODE ведь они вырезаны. Делаем со строкой че угодно..
1 2
<?php $str = ......
$str = ......?>
А потом ставим на место наши строки которые были обрамлены в CODE
1 2 3
<?php //str_replace может принимать в первых 2х параметрах и массивы а так как у нас коды и
//строки в этих массивах соответствуют то мы воспользуемся этим не опасаясь путаницы
$str = str_replace($codeUni, $codeBox, $str);?>
Таким образом сам тег CODE заменился а вписаные в него теги нет.