Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выборка текста между двумя символами в многократном повторении

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Sankaboy
Отправлено: 16 Ноября, 2014 - 14:28:33
Post Id



Гость


Покинул форум
Сообщений всего: 96
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Ребята, привет! Не разу подобного не делал, поэтому реализовать полностью нужную ф-цию не получилось.
1. Есть текст:
CODE (html):
скопировать код в буфер обмена
  1. Как {счастлив} я, когда могу покинуть
  2. Докучный шум столицы и {двора}
  3. И убежать в пустынные дубровы,
  4. На берега сих {молчаливых} вод.
  5. О, скоро ли она со дна речного
  6. Подымется, {как} рыбка {золотая}?

2.Нужно каким-то образом выбрать все элементы, которые находятся в фигурных скобках, в массив.

У меня получилось выбрать через одно место(поп..у), т.е. сначало выберает первый элемент, все остальные остаются не выбранными. Потом первый элемент не выбранный, второй выбранный, последующие не выбранные и т.д.

Задача, простая, но мозги не могут собраться. Сложность именно в цикле поиска всех элементов сразу.

За ранее спасибо!
 
 Top
teddy
Отправлено: 16 Ноября, 2014 - 14:42:41
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




PHP:
скопировать код в буфер обмена
  1. $text = 'Ваш текст должен быть тут';
  2. preg_match_all('#{.*?}#us', $text, $matches);
  3. print_r($matches);
 
 Top
Sankaboy
Отправлено: 16 Ноября, 2014 - 14:43:46
Post Id



Гость


Покинул форум
Сообщений всего: 96
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Спасибо! Вот текст:
PHP:
скопировать код в буфер обмена
  1. preg_match_all('|{(.+?)}|is', $_POST['textstr'], $match);

(Добавление)
Теперь сижу голову ломаю над другим вопросом.
К примеру, в том же тексте все элементы имеют вид "{1|2}".
Нужно получить 2 текста с заменой на первое число элемента и на 2е по всем элементам.
Т.е. рез.:
PHP:
скопировать код в буфер обмена
  1.  
  2. 1.
  3. Как 1 я, когда могу покинуть
  4. Докучный шум столицы и 1
  5. И убежать в пустынные дубровы,
  6. На берега сих 1 вод.
  7.  
  8. 2.
  9. Как 2 я, когда могу покинуть
  10. Докучный шум столицы и 2
  11. И убежать в пустынные дубровы,
  12. На берега сих 2 вод.
  13.  
  14.  


Не могу никак это осилить. Помогите, пожалуйста.

(Отредактировано автором: 16 Ноября, 2014 - 15:39:04)

 
 Top
teddy
Отправлено: 16 Ноября, 2014 - 16:09:10
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Если я верно понял задачу, скорее всего подойдет что то типа такого:

PHP:
скопировать код в буфер обмена
  1.  
  2. $result = preg_replace_callback('#{(.*?)}#u', function($val){
  3.        
  4.     static $counter = 0;
  5.     $counter++;
  6.        
  7.     if($counter <= 2)
  8.         return strstr($val[1], '|', true);
  9.     else
  10.         return ltrim(strstr($val[1], '|'), '|');
  11.  
  12. }, $text);
  13.  
  14. echo $result;
  15.  

(Отредактировано автором: 16 Ноября, 2014 - 16:12:06)

 
 Top
Sankaboy
Отправлено: 16 Ноября, 2014 - 16:33:08
Post Id



Гость


Покинул форум
Сообщений всего: 96
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Ошибку 500 выдает браузер. ПХП на хосте 5.2..., поэтому ф-ция preg_replace_callback должна работать. ПХП ошибки вывести в браузере не получается, хотя в самам файле включил вывод. Что же не так в тексте?
$val - это каждый элемент после поиска ф-ции? Т.е. я его не задаю, задаю только $text.
 
 Top
teddy
Отправлено: 16 Ноября, 2014 - 16:43:58
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Может где то синтаксическая ошибка или ещё чего там?
Смотрите error log на сервере. Думаю будет ясно в чем причина ошибки.

Sankaboy пишет:
$val - это каждый элемент после поиска ф-ции?

Да. Каждое совпадение будет автоматически передано в колбек как параметр.
(Добавление)
Sankaboy пишет:
ПХП на хосте 5.2..

А... ну да. Анонимные функции ведь в 5.3 появились.

Функцию оформите по старинке типа function myMatches($val) и её название передайте как строку в качестве параметра вместо анонимной функции

(Отредактировано автором: 16 Ноября, 2014 - 16:47:58)

 
 Top
Sankaboy
Отправлено: 16 Ноября, 2014 - 17:41:04
Post Id



Гость


Покинул форум
Сообщений всего: 96
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Точно 5.2 - это старая. Она стоит у меня только потому, что движки матерятся на новые версии пхп. Типа нужно старые ф-ции заменить на новые, а это все мозготр*х.

PHP:
скопировать код в буфер обмена
  1. function ns($val){
  2.        
  3.     static $counter = 0;
  4.     $counter++;
  5.        
  6.     if($counter <= 2){
  7.         return strstr($val[1], '|', true);
  8.    } else{
  9.         return ltrim(strstr($val[1], '|'), '|');
  10.  }
  11. }
  12. echo  preg_replace_callback('#{(.*?)}#u', 'ns' , $_POST['textstr']);


Погуглил и увидел, что 2й параметр в ф-ции preg_replace_callback задается в скобках, а именно название ф-ции. Для меня это дикость. Да и саму preg_replace_callback - никогда не учил.

Результат выдает пхп текст, но выдает сам стартовый текст, т.е. без изменений.
Что же не так?
 
 Top
teddy
Отправлено: 16 Ноября, 2014 - 19:01:17
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Sankaboy пишет:
но выдает сам стартовый текст

Может я неверно понял задачу. Давайте заново.

Есть текст, в котором имеются идентичные вставки вида {1|2}.

Нужно первые две вставки заменить на левую часть этой вставки {1|2} (т.е на единицу в данном случае), а все остальные вставки заменить на правую часть (двойку), я правильно понимаю? Если да, то должно быть все нормально.
 
 Top
Sankaboy
Отправлено: 16 Ноября, 2014 - 22:43:25
Post Id



Гость


Покинул форум
Сообщений всего: 96
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Есть текст:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. Как {ааа|bbb} я, когда могу покинуть
  3. Докучный шум столицы и {ааа|bbb}
  4. И убежать в пустынные дубровы,
  5. На берега сих {ааа|bbb} вод.
  6.  
  7.  


Нужно получить 2 текста, потому что 2 значения в скобках фигурных:
1й текст:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. Как ааа я, когда могу покинуть
  3. Докучный шум столицы и ааа
  4. И убежать в пустынные дубровы,
  5. На берега сих ааа вод.
  6.  
  7.  


2й текст:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. Как bbb я, когда могу покинуть
  3. Докучный шум столицы и bbb
  4. И убежать в пустынные дубровы,
  5. На берега сих bbb вод.
  6.  
  7.  


Вот так должно получиться. Если значения в скобках 3 или 6 значит, текстов должно быть 6.
Так понятние.

(Отредактировано автором: 16 Ноября, 2014 - 23:56:34)

 
 Top
Sankaboy
Отправлено: 17 Ноября, 2014 - 15:43:30
Post Id



Гость


Покинул форум
Сообщений всего: 96
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Вот, кажется, организовал. Все очень просто, только мозги почему-то плохо работают в последнее время((

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. preg_match_all('|{(.+?)}|is', $_POST['textstr'], $match); // ...{1|2} .. {3|4}.
  4.  
  5. $vestext = array();
  6. foreach($match[1] as $key3=>$name3){
  7. $textstr = explode("|", $name3);
  8. foreach($textstr as $key2=>$name2){
  9. if(!$vestext[$key2]){
  10. $vestext[$key2]= $_POST['textstr'];
  11. }
  12. $vestext[$key2] = str_replace($name3,$name2,$vestext[$key2]);
  13. $vestext[$key2] = str_replace('{','',$vestext[$key2]);
  14. $vestext[$key2] = str_replace('}','',$vestext[$key2]);
  15. }
  16.  
  17. }
  18.  
  19. foreach($vestext as $key=>$name3){
  20. echo "<br />". $key."<br />";
  21. print_r($name3);
  22. }
  23.  


Может кому-то пригадится этот текст Ниндзя
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB