Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа с макросами
 
 автор: Shorr Kan   (24.07.2006 в 16:25)   письмо автору
 
 

У меня есть текст, с некоторыми макросами. Их надо менять на определенные блоки текста.

В случае, если макросы разные, то проблем нет. Но если они одинаковые... их всё равно надо менять на разные блоки текста.

Фактически, мне нужен аналог четвертого входящего значения в str_replace (тот, который count) в php5 , но для php4. То есть, мне нужно циклично пройтись по тексту и первое (и ТОЛЬКО первое) совпадение - заменить на что-то. При следующей итерации - уже следующее.... и на другое что-то.

Проблема у меня именно с ограничением замен - str_replace в php4 не имеет четвертого входящего значения...

   
 
 автор: cheops (из кафе)   (24.07.2006 в 16:28)
 
   для: Shorr Kan   (24.07.2006 в 16:25)
 

Хм... а может примерчик? Что-то не очень понятно...

   
 
 автор: Shorr Kan   (24.07.2006 в 16:56)   письмо автору
 
   для: cheops (из кафе)   (24.07.2006 в 16:28)
 


<table>

<tr>
<td>[text_30]</td>
<td>[text_20]</td>
</tr>

<tr>
<td>[text_30]</td>
<td>[text_30]</td>
</tr>

</table>


Вот. Мне нужно первую [text_30] заменить на $text1 , [text_20] - на $text2 , вторую [text_30] на $text3 , и третью [text_30] - на $text4


p.s. Говоря по правде - [text_ЧИСЛО] - может быть любым. Я кое-как выкрутился с определением количества таких подстрок в шаблоне... и выяснением этого "ЧИСЛА"... Но от адекватного решения с помощью регулярных выражений - не отказался бы.

   
 
 автор: Shorr Kan   (25.07.2006 в 06:51)   письмо автору
 
   для: Shorr Kan   (24.07.2006 в 16:56)
 

Актуальность этого вопроса всё ещё велика. Точнее - величина актуальности - не изменилась...

   
 
 автор: Duran   (25.07.2006 в 09:07)   письмо автору
 
   для: Shorr Kan   (25.07.2006 в 06:51)
 

Хм... Я так понял, для каждой text_N есть свой упорядоченный массив строк на замену ?

   
 
 автор: Shorr Kan   (25.07.2006 в 09:49)   письмо автору
 
   для: Duran   (25.07.2006 в 09:07)
 

Даже проще - есть четкая строка на каждую text_N. Мне просто нужно отличить одну text_N от другой... даже если они одинаково выглядят. Я не справляюсь именно с этим.

Говоря проще - мне нужно определить - какая это text_N - первая, вторая, третья и так далее.
Я могу это сделать смесью explode, strpos, и прочего... Но получается что-то очень нехорошее и тугоповоротливое.

   
 
 автор: Axxil   (25.07.2006 в 11:11)   письмо автору
 
   для: Shorr Kan   (25.07.2006 в 09:49)
 

Если вы выполните поиск по такому регулярному выражению, то в итоговом массиве у вас появятся искомые значения в порядке появления в тексте.

<?
$str 
"<table> 

<tr> 
<td>[text_30]</td> 
<td>[text_20]</td> 
</tr> 

<tr> 
<td>[text_30]</td> 
<td>[text_30]</td> 
</tr> 

</table> "
;
$pattern '|\[([^\]]*)\]|is';
preg_match_all($pattern,$str,$out);
print_r($out[1]);
?>

   
 
 автор: Shorr Kan   (25.07.2006 в 16:05)   письмо автору
 
   для: Axxil   (25.07.2006 в 11:11)
 

Да-да-да. То что нужно. Спасибо. Получается - я ошибся разделом.

   
 
 автор: cheops   (25.07.2006 в 11:02)   письмо автору
 
   для: Shorr Kan   (24.07.2006 в 16:56)
 

А по какому принципу идёт сопоставление: [text_30] заменить на $text1 , [text_20] - на $text2 , вторую [text_30] на $text3 , и третью [text_30] - на $text4. Т.е. какова логика замены?

   
 
 автор: Shorr Kan   (25.07.2006 в 16:04)   письмо автору
 
   для: cheops   (25.07.2006 в 11:02)
 

Порядок появления. То есть - первое встречное [text_N] - надо заменить на $text1 ... а пятое встречное - на $text5.

   
 
 автор: Shorr Kan   (25.07.2006 в 16:44)   письмо автору
 
   для: Shorr Kan   (25.07.2006 в 16:04)
 

Чёрт, почти. Вытащить-то - это вытаскивает, а вот как заменить? Ну я получил массив, прохожусь по нему в цикле... но как мне заменить именно первую text_30 - на $text1 , а именно третью text_30 - на $text3 ?

   
 
 автор: Axxil   (25.07.2006 в 17:07)   письмо автору
 
   для: Shorr Kan   (25.07.2006 в 16:44)
 

Не понял в чём проблема?
Так и менять. Первый элемент массива $text1, второй элемент - $text2 ... n элемент $textn
Или я чё-то не правильно понял?

   
 
 автор: Shorr Kan   (25.07.2006 в 18:18)   письмо автору
 
   для: Axxil   (25.07.2006 в 17:07)
 

Но я же должен получить исходный текст с замененными макросами. Но никак не отдельный массив.

Т.е., мне нужно получить:


<?
$str 
"<table> 

<tr> 
<td>
$text1</td> 
<td>
$text2</td> 
</tr> 

<tr> 
<td>
$text3</td> 
<td>
$text4</td> 
</tr> 

</table> "

?>

   
 
 автор: axxil   (25.07.2006 в 21:27)   письмо автору
 
   для: Shorr Kan   (25.07.2006 в 18:18)
 

Тогда непонятно зачем огород городить с [text_30] и т.д.?
Нельзя сразу с переменными. Или дать уникальные имена подстановкам...

   
 
 автор: Shorr Kan   (26.07.2006 в 06:18)   письмо автору
 
   для: axxil   (25.07.2006 в 21:27)
 

Нельзя. Это называется макросами. А ещё - шаблонами. Человек задает то, что ему удобно - а скрипт решает - на что это заменить. И потом - если есть такая задача, то она есть - её надо решить... а не избежать. Понимаю, что проще затруднение обойти, нежели решить... Но в данном случае - обойти нельзя.

   
 
 автор: Axxil   (26.07.2006 в 09:47)   письмо автору
 
   для: Shorr Kan   (26.07.2006 в 06:18)
 

> И потом - если есть такая задача, то она есть - её надо решить... а не избежать

Иногда полезнее задачу заменить на аналогичную, но с большими допущениями в пределах допустимой погрешности.
Почему нельзя дать шаблонным переменным уникальные имена?
Например:

<table>  

<tr>  
<td>[text_10]</td>  
<td>[text_20]</td>  
</tr>  

<tr>  
<td>[text_30]</td>  
<td>[text_40]</td>  
</tr>  

</table>

   
 
 автор: Shorr Kan   (26.07.2006 в 09:55)   письмо автору
 
   для: Axxil   (26.07.2006 в 09:47)
 

Именно так - нельзя. Делай я для себя - я бы, конечно, сделал [text_N_M] - где N - уникальный номер, а M - эти самые "30", "20", "40", и так далее. Но я делаю не для себя - и от меня ждут этого решения.

Да и потом - вот теперь уже - просто интересно. Будь это php5 - я бы сделал просто str_replace(); - с четтвертым параметром (count), но неужели на php4 этого же сделать нельзя? В частности - неужели регулярные выражения не могут произвести замену "A" на "B" - только один раз, в самом первом встреченном месте?

А что касается нобелевской премии - а зачем?... Был бы смысл - доказали бы. А если после этого будет смысл доказать обратное - докажем и обратное. Математика - наука точная, но витиеватая. Да и потом - вопрос по теме строковых функций и регулярных выражений, а не по разделу math...
А какова сумма нобелевской премии?

   
 
 автор: Axxil   (26.07.2006 в 09:56)   письмо автору
 
   для: Shorr Kan   (26.07.2006 в 09:55)
 

-

   
 
 автор: Shorr Kan   (26.07.2006 в 10:00)   письмо автору
 
   для: Axxil   (26.07.2006 в 09:56)
 

Не-не, нехорошо прятать бизнес-предложение... :)

   
 
 автор: Duran   (26.07.2006 в 10:06)   письмо автору
 
   для: Shorr Kan   (26.07.2006 в 10:00)
 

Макрос - вообще штука применимая тока к "вживляемым" объектам, например приложение VBA в excell. Здесь скорее всего применимо понятие "шаблон". Проблема в том, что вы не даете нам саму задачу, а желаете найти реализацию вашего решения поставленной задачи.
Если вам нужно найти решение, а не создавать проблему, может стоит написать именно саму задачу ?

   
 
 автор: Shorr Kan   (26.07.2006 в 10:44)   письмо автору
 
   для: Duran   (26.07.2006 в 10:06)
 

Проблема в том, что у меня нет самой исходной задачи. У меня есть желаемая человеком реализация - и я её должен реализовать. То есть - я не могу написать задачу. Если бы мог - я бы, как уже сказал, решил бы другим макаром это.
Но! У меня дано изначально: [text_N] , где N - это количество выполняемых действий. Как вы полнимаете - в одном документе text_N может быть и одинаковым - нельзя НЕ рассчитывать на это. Именно поэтому я и решаю проблему - человек может ввести в один документ не единожды text_30 ... а пять раз. Мне нужно только сделать замену первого найденного соответствия

http://php.net/str_replace - взгляните на параметр count. Это то, что мне нужно. И только. В php4 этого нет. Но, видимо, есть аналогичная возможность, используя регулярные выражения.

Как видите - я не создаю проблему. Я ищу решение к поставленной мне задаче, которая звучит примерно так - "реализация должна быть такая".
Вы никогда не встречались с необходимостью сделать именно так, а не иначе, даже если иначе было бы и проще, и умнее, и лучше, и надежнее? Если нет - вот, косвенно встретились...

   
 
 автор: ЯR   (26.07.2006 в 11:06)   письмо автору
 
   для: Shorr Kan   (26.07.2006 в 10:44)
 

Может так:

<?php
$str 
"<table>  
<tr>  <td>[text_30]</td>  <td>[text_20]</td>  </tr>  
<tr>  <td>[text_30]</td>  <td>[text_30]</td>  </tr>  
</table> "
;
$n 30;
preg_replace("#(.*)<td>\[text_$n\]</td>(.*)#i""\\1<td>$text1</td>\\2"$str1);
?>


?

   
 
 автор: Axxil   (26.07.2006 в 10:57)   письмо автору
 
   для: Shorr Kan   (26.07.2006 в 10:00)
 

Да просто с теоремой Ферма лоханулся, вот и убрал чтоб не позориться :)
Нобелевская премия $1.000.000 если не ошибаюсь.
Но дают её обычно лет через 20 после открытия. Так что надо торопиться :)

У функции preg_replace есть 4 параметр который и ограничивает кол-во замен.
Только пока не врублюсь какэто к вашему случаю приделать...
Щас покумекаем

   
 
 автор: Axxil   (26.07.2006 в 11:08)   письмо автору
 
   для: Shorr Kan   (24.07.2006 в 16:25)
 

Вот типа того:

<?
$str 
"<table>  

<tr>  
<td>[text_30]</td>  
<td>[text_20]</td>  
</tr>  

<tr>  
<td>[text_30]</td>  
<td>[text_30]</td>  
</tr>  

</table> "

$pattern '|\[([^\]]*)\]|is'
preg_match_all($pattern,$str,$out); 
print_r($out[1]); 
foreach(
$out[1] as $key=>$item){
  
$str preg_replace("|\[".$item."\]|is",'$text'.$key,$str,1);

echo 
htmlentities($str);
?>

   
 
 автор: Shorr Kan   (26.07.2006 в 11:14)   письмо автору
 
   для: Axxil   (26.07.2006 в 11:08)
 

Вариант ЯR - я не понял, как работает, но работает.
А вот ваш, Axxil, работает так, что я даже понял...

Спасибо :)

   
 
 автор: ЯR   (26.07.2006 в 11:19)   письмо автору
 
   для: Shorr Kan   (26.07.2006 в 11:14)
 

>Вариант ЯR - я не понял, как работает, но работает.
А что тут непонятного?
Заменяется всё, что подходит под шаблон. Лимит - 1.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования