Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Замена символов в рамках тэгов


Автор: Wolf1994 25.12.2005, 16:41
Пожалуйста, помогите выполнить такую замену:
Код

htmlcodeadd<a href="1.php">1</a> abracadabra <a href="2.php">2</a>htmlcodeadd<a href="3.php">3</a>

на:
Код

htmlcodeadd<a href="1.php">1</a> abracadabra <a href="2.php">2</a>htmlcodeadd&lt;a href="3.php"&gt;3&lt;/a&gt;


То есть сделать все тэги в рамках htmlcodeadd - активными, а за рамками - печатными. Мне пока не хватает знаний:
Код

$document='htmlcodeadd<a href="1.php">1</a> abracadabra <a href="2.php">2</a>htmlcodeadd<a href="2.php">3</a>';
$document=str_replace ('<', '&lt;', $document);
$document=str_replace ('>', '&gt;', $document);

$search = array ('@(htmlcodeadd.*)(&lt;)(.*htmlcodeadd)@i',
                 '@(htmlcodeadd.*)(&gt;)(.*htmlcodeadd)@i');
$replace = array ('$1<$3',
                  '$1>$3');

print preg_replace ($search, $replace, $document);

- Всё на что хватило ума. Буду пробовать дальше, но не думаю, что получится что-то путное smile

Автор: Wolf1994 25.12.2005, 18:05
Немного поэкспериментировав пришёл к выводу, что замена в приведённом примере осуществляется ОДИН раз. Можно ли присвоить &lt;&gt; параметры, которые заставять поменять ВСЕ эти тэги в рамках htmlcodeadd?

Автор: Wolf1994 25.12.2005, 19:48
Нашёл выход!!! Переделал синтаксис тэгов и всё заработало (пример)!!! Вот результат:
Код

$tag="[tag]";
$tag1="[tag1]";
$tag2="[tag2]";
$tag3="[tag3]";

$temp='[tag1]<a href="1.php">1</a> abracadabra <a href="2.php">2</a>[tag1]<a href="3.php">3</a>[tag2]<a href="4.php">4</a>[tag2]ok';

//Ищу и запоминаю различные тэги
preg_match_all ("/\[(tag.?)\]/", $temp, $matches);

//Унифицирую тэги под один тэг, чтобы можно было разбить эксплодом
$temp=str_replace ($tag1, $tag, $temp);
$temp=str_replace ($tag2, $tag, $temp);
$temp=str_replace ($tag3, $tag, $temp);

//Разбиваю строку на составляющие
$ex=explode ($tag, $temp);

$temp="";
for ($i=0; $i<=count ($ex); $i++)
{
 if ( ($i+1)/2==floor (($i+1)/2) )//Обрабатываю чётные элементы массива разбитой строки
 {
  if ($matches [0] [$i-1]==$tag1)//Если запомненый тэг - tag1>обрабатываю, как одно выражение
  {
   $ex [$i]="îáðàáîòêà-1:".$ex [$i].":îáðàáîòêà-1";
  }
  if ($matches [0] [$i-1]==$tag2)
  {
   $ex [$i]="îáðàáîòêà-2:".$ex [$i].":îáðàáîòêà-2";//Если запомненый соответствующий тэг=tag2 - как другое
  }
  if ($matches [0] [$i-1]==$tag3)
  {
   $ex [$i]="îáðàáîòêà-3:".$ex [$i].":îáðàáîòêà-3";//...как третье
  }
 }
 //Собираю обработанные части строки в прежнюю строку
 $temp.=$ex [$i];
}
//Вывожу результат :)
print $temp;


Может кому-нибудь пригодится...

Автор: -=Ustas=- 26.12.2005, 11:16
Извини за глупый вопрос... А для чего это может пригодиться? Что это ты сделал?

Автор: Wolf1994 26.12.2005, 12:56
Скорее всего дам глупый ответ, так как не знаю как такое делается по стандартам, например в этом форуме. А мне это надо было, для скрипта формирования текста: если нет тэгов - экранируются спецсимволы+добавляются смайлики+активируются URL'ы, если тэг 1 - никакой обработки, чистый HTML, если тэг 2 - чистый HTML+добавляются смайлики, если тэг 3 - идёт окно для кода. Благодаря использованию регулярок, удалось ускорить работу скрипта в ~3 раза.

Кстати обработку URL я брал из "Ответы на часто задаваемые вопросы по программированию". И нашёл небольшую помарку. После исправления получился такой код:
Код

eregi_replace("((f|ht)tps?://[^ \r\n]*[^ \n]*[^ \n,.:!?)]*[^ \r\n,.:!?)])", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $temp);

- там был тэг \r вместо \n / \r\n.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)