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

Форум Регулярные Выражения

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Замена псевдотэгов списков [list][*]...[/list]

Сообщения:  [1-10]   [11-14] 

 
 автор: kvecxjo   (21.12.2005 в 09:36)   письмо автору
 
   для: cheops   (17.12.2005 в 13:02)
 

Да нет, дело не в том. Жадность и так минимальная (ли?). Просто, когда анализатор натыкается на условие начала поиска A1, то он хватает всё до первого B1, не обращая внимания на то, что встречаются еще A1... Да, из-за того, что жадность выключена, он останавливается на первом же B1, иначе он искал бы последнюю.
Пример:
надо:
xxxA1xxxA1xxxB1xxxB1xxx
а получается:
xxxA1xxxA1xxxB1xxxB1xxx
Не получается сделать его менее жадным, никак... :(

   
 
 автор: cheops   (17.12.2005 в 13:02)   письмо автору
 
   для: kvecxjo   (17.12.2005 в 07:53)
 

Локально можно изменять, при помощи *? и +?

   
 
 автор: kvecxjo   (17.12.2005 в 07:53)   письмо автору
 
   для: kvecxjo   (14.12.2005 в 12:06)
 

Фактически, эту же проблему я описал в этой теме:
http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=10480&page=1
Даже при выключенной жадности слишком жадное выражение получается...

   
 
 автор: cheops   (15.12.2005 в 22:48)   письмо автору
 
   для: kvecxjo   (15.12.2005 в 14:34)
 

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

   
 
 автор: kvecxjo   (15.12.2005 в 14:34)   письмо автору
 
   для: cheops   (15.12.2005 в 14:15)
 

Стало немногим лучше... Проблема с тем, что внутри пункта встречаются квадратные скобки и символы новой строки осталась...
Из такого:
[list=1] 
  [*]раз 
    [list] 
    [*]это [ b]пункт[ /b] 
         в две строки 
  [/list] 
[/list]

получается такое:
<ol> 
<li>раз </li> <ul> 
[*]это [ b]пункт[ /b] 
в две строки 
</ol> 
</ul>

   
 
 автор: cheops   (15.12.2005 в 14:15)   письмо автору
 
   для: kvecxjo   (15.12.2005 в 13:49)
 

Есть такое дело, но это уже не сложно обойти, попробуйте вот этот скрипт
<?php 
  $text 
"[list=1] 
  [*]раз 
    [list] 
    [*]это пункт 
         в [ b]две[ /b] строки 
  [/list] 
[/list]"

  
$pattern "#\[\*\]([^\]]*)\r\n#is"
  
$replacement "<li>\\1</li>"
  
$text preg_replace($pattern,$replacement,$text); 

  
$total substr_count($text,"[list=1]"); 
  
$pattern "#\[list=1\](.*)\[/list\]#isU"
  
$replacement "<ol>\\1</ol>"
  for(
$i 0$i $total$i++) 
  { 
    
$text preg_replace($pattern,$replacement,$text); 
  } 

  
$total substr_count($text,"[list]"); 
  
$pattern "#\[list\](.*)\[/list\]#isU"
  
$replacement "<ul>\\1</ul>"
  for(
$i 0$i $total$i++) 
  { 
    
$text preg_replace($pattern,$replacement,$text); 
  } 
  echo 
$text
?>

   
 
 автор: kvecxjo   (15.12.2005 в 13:49)   письмо автору
 
   для: cheops   (15.12.2005 в 13:08)
 

Так не выйдет... Ловится звездочка во вложенном списке. Да, и еще одна проблема, если разнотипные списки заменяем не одним выражением, а последовательно двумя, то еще и вложенность некорректно отрабатывается... Ага, еще и \r\n словили...
Ну, вот что получаем:
<ol>
<li>раз</li>
<li>два</li>
<li>три
<ul></li>
<li>три-один</li>
это пункт в [ b]две[ /b] строки
</ol>
</ul>


P.S. Сократим чуток код для дальнейших экспериментов?
[list=1] 
  [*]раз 
    [list] 
    [*]это пункт
         в [ b]две[ /b] строки 
  [/list] 
[/list]

   
 
 автор: cheops   (15.12.2005 в 13:08)   письмо автору
 
   для: cheops   (14.12.2005 в 14:48)
 

Попробуйте вот этот вариант
<?php 
  $text 
"[list=1] 
  [*]раз 
  [*]два 
  [*]три 
  [list] 
    [*]три-один 
        это пункт в [ b]две[ /b] строки 
  [/list] 
[/list]"

  
$total substr_count($text,"[list=1]"); 
  
$pattern "#\[list=1\](.*)\[/list\]#isU"
  
$replacement "<ol>\\1</ol>"
  for(
$i 0$i $total$i++) 
  { 
    
$text preg_replace($pattern,$replacement,$text); 
  } 
  
$total substr_count($text,"[list]"); 
  
$pattern "#\[list\](.*)\[/list\]#isU"
  
$replacement "<ul>\\1</ul>"
  for(
$i 0$i $total$i++) 
  { 
    
$text preg_replace($pattern,$replacement,$text); 
  } 
  
$pattern "#\[\*\]([^\]]*)\r\n#is"
  
$replacement "<li>\\1</li>"
  
$text preg_replace($pattern,$replacement,$text); 
  echo 
$text
?>

   
 
 автор: kvecxjo   (15.12.2005 в 11:42)   письмо автору
 
   для: cheops   (14.12.2005 в 14:48)
 

Русским языком я бы описал замену [*] так:

Заменить минимальные фрагменты, начинающиеся [*] и заканчивающиеся [*] или [/list] (не включая выражение, которым заканчивается), не содержащие внутри себя конструкцию [list]...[/list]


Нормально? Замена пойдет циклом, начиная с самых внутренних [list]...[/list]
Помогите это описать регулярным выражением.

Ой, минус этого дела - для замены вложенных конструкий [list] придется в цикле последовательно вызывать замены [*] и [list], нехорошо... Не вписывается в логику моей программы, которая вызывает циклом только одно выражение... :(

Может лучше так:
Заменить минимальные фрагменты, начинающиеся [*] и заканчивающиеся [*] или [/list] (не включая выражение, которым заканчивается), не содержащие внутри себя непарные псевдотеги [list]...[/list]

   
 
 автор: kvecxjo   (15.12.2005 в 07:17)   письмо автору
 
   для: cheops   (14.12.2005 в 14:48)
 


[list=1] 
  [*]раз 
  [*]два 
  [*]три 
  [list] 
    [*]три-один
        это пункт в [ b]две[ /b] строки 
  [/list] 
[/list] 

P.S. Я еще [ b]...[ /b] добавил, чтобы не возникло соблазна закрыть <li> по нахождению квадратной скобки. ;)

   

Сообщения:  [1-10]   [11-14] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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