| |
|
|
| | У меня есть текст, с некоторыми макросами. Их надо менять на определенные блоки текста.
В случае, если макросы разные, то проблем нет. Но если они одинаковые... их всё равно надо менять на разные блоки текста.
Фактически, мне нужен аналог четвертого входящего значения в str_replace (тот, который count) в php5 , но для php4. То есть, мне нужно циклично пройтись по тексту и первое (и ТОЛЬКО первое) совпадение - заменить на что-то. При следующей итерации - уже следующее.... и на другое что-то.
Проблема у меня именно с ограничением замен - str_replace в php4 не имеет четвертого входящего значения... | |
| |
|
|
| |
автор: cheops (из кафе) (24.07.2006 в 16:28) |
|
| |
для: Shorr Kan
(24.07.2006 в 16:25)
| | | Хм... а может примерчик? Что-то не очень понятно... | |
| |
|
|
| |
|
|
| |
для: 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
(24.07.2006 в 16:56)
| | | Актуальность этого вопроса всё ещё велика. Точнее - величина актуальности - не изменилась... | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(25.07.2006 в 06:51)
| | | Хм... Я так понял, для каждой text_N есть свой упорядоченный массив строк на замену ? | |
| |
|
|
| |
|
|
| |
для: Duran
(25.07.2006 в 09:07)
| | | Даже проще - есть четкая строка на каждую text_N. Мне просто нужно отличить одну text_N от другой... даже если они одинаково выглядят. Я не справляюсь именно с этим.
Говоря проще - мне нужно определить - какая это text_N - первая, вторая, третья и так далее.
Я могу это сделать смесью explode, strpos, и прочего... Но получается что-то очень нехорошее и тугоповоротливое. | |
| |
|
|
| |
|
|
| |
для: 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]);
?>
|
| |
| |
|
|
| |
|
|
| |
для: Axxil
(25.07.2006 в 11:11)
| | | Да-да-да. То что нужно. Спасибо. Получается - я ошибся разделом. | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(24.07.2006 в 16:56)
| | | А по какому принципу идёт сопоставление: [text_30] заменить на $text1 , [text_20] - на $text2 , вторую [text_30] на $text3 , и третью [text_30] - на $text4. Т.е. какова логика замены? | |
| |
|
|
| |
|
|
| |
для: cheops
(25.07.2006 в 11:02)
| | | Порядок появления. То есть - первое встречное [text_N] - надо заменить на $text1 ... а пятое встречное - на $text5. | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(25.07.2006 в 16:04)
| | | Чёрт, почти. Вытащить-то - это вытаскивает, а вот как заменить? Ну я получил массив, прохожусь по нему в цикле... но как мне заменить именно первую text_30 - на $text1 , а именно третью text_30 - на $text3 ? | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(25.07.2006 в 16:44)
| | | Не понял в чём проблема?
Так и менять. Первый элемент массива $text1, второй элемент - $text2 ... n элемент $textn
Или я чё-то не правильно понял? | |
| |
|
|
| |
|
|
| |
для: 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> ";
?>
|
| |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(25.07.2006 в 18:18)
| | | Тогда непонятно зачем огород городить с [text_30] и т.д.?
Нельзя сразу с переменными. Или дать уникальные имена подстановкам... | |
| |
|
|
| |
|
|
| |
для: axxil
(25.07.2006 в 21:27)
| | | Нельзя. Это называется макросами. А ещё - шаблонами. Человек задает то, что ему удобно - а скрипт решает - на что это заменить. И потом - если есть такая задача, то она есть - её надо решить... а не избежать. Понимаю, что проще затруднение обойти, нежели решить... Но в данном случае - обойти нельзя. | |
| |
|
|
| |
|
|
| |
для: 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>
|
| |
| |
|
|
| |
|
|
| |
для: Axxil
(26.07.2006 в 09:47)
| | | Именно так - нельзя. Делай я для себя - я бы, конечно, сделал [text_N_M] - где N - уникальный номер, а M - эти самые "30", "20", "40", и так далее. Но я делаю не для себя - и от меня ждут этого решения.
Да и потом - вот теперь уже - просто интересно. Будь это php5 - я бы сделал просто str_replace(); - с четтвертым параметром (count), но неужели на php4 этого же сделать нельзя? В частности - неужели регулярные выражения не могут произвести замену "A" на "B" - только один раз, в самом первом встреченном месте?
А что касается нобелевской премии - а зачем?... Был бы смысл - доказали бы. А если после этого будет смысл доказать обратное - докажем и обратное. Математика - наука точная, но витиеватая. Да и потом - вопрос по теме строковых функций и регулярных выражений, а не по разделу math...
А какова сумма нобелевской премии? | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(26.07.2006 в 09:55)
| | | - | |
| |
|
|
| |
|
|
| |
для: Axxil
(26.07.2006 в 09:56)
| | | Не-не, нехорошо прятать бизнес-предложение... :) | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(26.07.2006 в 10:00)
| | | Макрос - вообще штука применимая тока к "вживляемым" объектам, например приложение VBA в excell. Здесь скорее всего применимо понятие "шаблон". Проблема в том, что вы не даете нам саму задачу, а желаете найти реализацию вашего решения поставленной задачи.
Если вам нужно найти решение, а не создавать проблему, может стоит написать именно саму задачу ? | |
| |
|
|
| |
|
|
| |
для: Duran
(26.07.2006 в 10:06)
| | | Проблема в том, что у меня нет самой исходной задачи. У меня есть желаемая человеком реализация - и я её должен реализовать. То есть - я не могу написать задачу. Если бы мог - я бы, как уже сказал, решил бы другим макаром это.
Но! У меня дано изначально: [text_N] , где N - это количество выполняемых действий. Как вы полнимаете - в одном документе text_N может быть и одинаковым - нельзя НЕ рассчитывать на это. Именно поэтому я и решаю проблему - человек может ввести в один документ не единожды text_30 ... а пять раз. Мне нужно только сделать замену первого найденного соответствия
http://php.net/str_replace - взгляните на параметр count. Это то, что мне нужно. И только. В php4 этого нет. Но, видимо, есть аналогичная возможность, используя регулярные выражения.
Как видите - я не создаю проблему. Я ищу решение к поставленной мне задаче, которая звучит примерно так - "реализация должна быть такая".
Вы никогда не встречались с необходимостью сделать именно так, а не иначе, даже если иначе было бы и проще, и умнее, и лучше, и надежнее? Если нет - вот, косвенно встретились... | |
| |
|
|
| |
|
|
| |
для: 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", $str, 1);
?>
|
? | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(26.07.2006 в 10:00)
| | | Да просто с теоремой Ферма лоханулся, вот и убрал чтоб не позориться :)
Нобелевская премия $1.000.000 если не ошибаюсь.
Но дают её обычно лет через 20 после открытия. Так что надо торопиться :)
У функции preg_replace есть 4 параметр который и ограничивает кол-во замен.
Только пока не врублюсь какэто к вашему случаю приделать...
Щас покумекаем | |
| |
|
|
| |
|
|
| |
для: 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);
?>
|
| |
| |
|
|
| |
|
|
| |
для: Axxil
(26.07.2006 в 11:08)
| | | Вариант ЯR - я не понял, как работает, но работает.
А вот ваш, Axxil, работает так, что я даже понял...
Спасибо :) | |
| |
|
|
| |
|
|
| |
для: Shorr Kan
(26.07.2006 в 11:14)
| | | >Вариант ЯR - я не понял, как работает, но работает.
А что тут непонятного?
Заменяется всё, что подходит под шаблон. Лимит - 1. | |
| |
|
|