|
|
|
|
|
для: cheops
(17.12.2005 в 13:02)
| | Да нет, дело не в том. Жадность и так минимальная (ли?). Просто, когда анализатор натыкается на условие начала поиска A1, то он хватает всё до первого B1, не обращая внимания на то, что встречаются еще A1... Да, из-за того, что жадность выключена, он останавливается на первом же B1, иначе он искал бы последнюю.
Пример:
надо:
xxxA1xxxA1xxxB1xxxB1xxx
а получается:
xxxA1xxxA1xxxB1xxxB1xxx
Не получается сделать его менее жадным, никак... :( | |
|
|
|
|
|
|
|
для: 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
Даже при выключенной жадности слишком жадное выражение получается... | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: 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;
?>
|
| |
|
|
|
|
|
|
|
для: 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
(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;
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(14.12.2005 в 14:48)
| | Русским языком я бы описал замену [*] так:
Заменить минимальные фрагменты, начинающиеся [*] и заканчивающиеся [*] или [/list] (не включая выражение, которым заканчивается), не содержащие внутри себя конструкцию [list]...[/list]
|
Нормально? Замена пойдет циклом, начиная с самых внутренних [list]...[/list]
Помогите это описать регулярным выражением.
Ой, минус этого дела - для замены вложенных конструкий [list] придется в цикле последовательно вызывать замены [*] и [list], нехорошо... Не вписывается в логику моей программы, которая вызывает циклом только одно выражение... :(
Может лучше так:
Заменить минимальные фрагменты, начинающиеся [*] и заканчивающиеся [*] или [/list] (не включая выражение, которым заканчивается), не содержащие внутри себя непарные псевдотеги [list]...[/list]
|
| |
|
|
|
|
|
|
|
для: cheops
(14.12.2005 в 14:48)
| |
[list=1]
[*]раз
[*]два
[*]три
[list]
[*]три-один
это пункт в [ b]две[ /b] строки
[/list]
[/list]
|
P.S. Я еще [ b]...[ /b] добавил, чтобы не возникло соблазна закрыть <li> по нахождению квадратной скобки. ;) | |
|
|
|
|