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
Форумы портала PHP.SU :: Версия для печати :: шаблоны, родные...
Форумы портала PHP.SU » PHP » Регулярные выражения » шаблоны, родные...

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

1. Вездеход - 20 Декабря, 2009 - 01:11:26 - перейти к сообщению
граждане, помогите с регуляркой =)

есть текст вида:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. {{P1}}
  3. {{P1:P2}}
  4. {{P1:P2:P3}}
  5. {{P1:P2:P3:P4}}
  6.  


подскажите какую регулярку составить чтобы в итоге после обработки был массив, в котором были части P1, P2, P3, P4

пробовал так:
PHP:
скопировать код в буфер обмена
  1. preg_match_all("~{{(.*)(:.*)*}}~u", $tpl, $regs, PREG_SET_ORDER);

но не получается - в итоге возвращается массив из того что между {{ и }} , без разбития по частям... т.е. он вторую часть регулярки (:.*)* читает не верно. пробовал делать ограничения на разделение но все равно...

п.с.
P1, P2, P3, P4 - произвольные комбинации символов
2. valenok - 20 Декабря, 2009 - 08:47:38 - перейти к сообщению
explode ?
3. Вездеход - 20 Декабря, 2009 - 10:51:54 - перейти к сообщению
valenok
да, это как вариант вопщем то...
просто не хотел использовать explode, потому что много раз придется его вызывать... боюсь лишней нагрузки
4. valenok - 20 Декабря, 2009 - 11:54:39 - перейти к сообщению
Может тебе вырезать все {x , :x: , x}
а потом удалить дублирующиеся элементы из массива
5. Champion - 20 Декабря, 2009 - 11:55:49 - перейти к сообщению
Почему много раз? 1 раз explode и trim для первого и последнего элемента. trim со вторым аргументом { и } чтоб эти скобки отрезать.
6. Вездеход - 20 Декабря, 2009 - 20:38:19 - перейти к сообщению
Champion пишет:
Почему много раз? 1 раз explode и trim для первого и последнего элемента. trim со вторым аргументом { и } чтоб эти скобки отрезать.


ненене, тут совсем другое дело....
есть текст. в нем могут встречаться шаблоны как те, которые я написал выше.
вот все шаблоны я вытащить могу. а чтобы их сразу корректно на части разбить - не получается...
если в шаблоне (страницы) есть к примеру 20 разных шаблонов - мне 20 раз нужно будет обрабатывать строку которая между фигурными скобками...
потому и нужна регулярка ...
7. trot - 20 Декабря, 2009 - 20:47:37 - перейти к сообщению
Попробуй это

{{([^}}:]*)(?::([^}}:]*))*}}
8. Вездеход - 20 Декабря, 2009 - 20:54:00 - перейти к сообщению
trot пишет:
Попробуй это

{{([^}}:]*)(?::([^}}:]*))*}}


отлично!
уже может брать из таких вариантов все
CODE (text):
скопировать код в буфер обмена
  1. {{P1}}
  2. {{P1:P2}}
  3. {{P1:P2:P3}}
  4. {{P1:P2:P3:P4}}

однако выбирает только первое и последнее значение...)
т.е. в последнем примере он взял только Р1 и Р4
9. trot - 20 Декабря, 2009 - 21:02:13 - перейти к сообщению
В данном случае второй элемент массива (там где Р4), это тоже массив.
Т.е. в первом элемента массива лежит значение Р1, а во втором элемент лежит массив с элементами от Р2 до всего остального.
10. Вездеход - 20 Декабря, 2009 - 21:03:57 - перейти к сообщению
вот такой текст парсю:
CODE (text):
скопировать код в буфер обмена
  1. <table width="100%" border="0" cellspacing="0" cellpadding="0">
  2.           <tr>
  3.             <td width="20" align="left" valign="middle"><input type="checkbox" name="test" id="test" /></td>
  4.             <td width="20" align="left" valign="middle">{{TEST}}</td>
  5.             <td width="50" align="left" valign="middle">{{TEST:123}}</td>
  6.             <td width="300" align="left" valign="middle">{{TEST:123:456}}</td>
  7.             <td align="left" valign="middle">{{TEST:123:456:789}}</td>
  8.           </tr>
  9.           <tr>
  10.             <td colspan="5" align="left" valign="top">msg</td>
  11.           </tr>
  12. </table>


вот такой результат:
CODE (text):
скопировать код в буфер обмена
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => {{TEST}}
  6.             [1] => TEST
  7.         )
  8.  
  9.     [1] => Array
  10.         (
  11.             [0] => {{TEST:123}}
  12.             [1] => TEST
  13.             [2] => 123
  14.         )
  15.  
  16.     [2] => Array
  17.         (
  18.             [0] => {{TEST:123:456}}
  19.             [1] => TEST
  20.             [2] => 456
  21.         )
  22.  
  23.     [3] => Array
  24.         (
  25.             [0] => {{TEST:123:456:789}}
  26.             [1] => TEST
  27.             [2] => 789
  28.         )
  29.  
  30. )
  31.  


вот такая регулярка:
PHP:
скопировать код в буфер обмена
  1. preg_match_all("~{{([^}}:]*)(?::([^}}:]*))*}}~u", $tpl, $regs, PREG_SET_ORDER);
11. trot - 20 Декабря, 2009 - 22:12:09 - перейти к сообщению
Да действительно в РНР запоминается первое и последнее найденное совпадение.

Что-то придумать другое не получается.

Предлагаю следующее

1. По выражению

CODE (text):
скопировать код в буфер обмена
  1. preg_match_all("~{{(.*?)}}~", $str, $arr)


находим и запоминаем все содержимое между {{ }}

2. Далее в цикле получаем требуемые массивы с помощью

CODE (text):
скопировать код в буфер обмена
  1. $arr2=explode(":",$arr[1][$i]);
12. Вездеход - 20 Декабря, 2009 - 22:16:19 - перейти к сообщению
trot пишет:
Предлагаю следующее

да, увы это пока основной вариант... =(
13. Champion - 21 Декабря, 2009 - 09:10:55 - перейти к сообщению
Вот пока что у меня получилось
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         $str = '23{{qw:sd:fg}}df
  3.         23{{qew:sed:feg}}dfg';
  4.         //preg_match_all('/((?(?<={){|:)\w+(?(?=})}|:))+}/ms', $str, $m);
  5.         preg_match_all('/((?(?<={){|:)\w)+/s', $str, $m);
  6.         preg_match_all('/(\w(?(?=})}|:))+/s', $str, $m);
  7.         var_dump($m);
Но закомментированная регулярка находит странно, а две следующие... Ну в общем, глянь. Если в них \w заменить на \w+, то почему-то они уже находят меньше... Ща еще попробую до ума довести
(Добавление)
PHP:
скопировать код в буфер обмена
  1.         preg_match_all('/
  2.         (?<={)(\w+
  3.                 (?(?=})(?=}) (?# if next symbol is } then current symbol is } too)
  4.                 | (?# esle if the next symbol is letter then current symbol is :.)
  5.                         (?(?=\w)(?=:))
  6.                 )
  7.         )+ /xs', $str, $m);
Находит только первую штуковину. А если убрать утверждение в начале, то находит всё. Но и то, что снаружи {{}}
(Добавление)
RomAndry Сделай, пожалуйста табулыцию в 4 пробела, а то ужас какой-то, когда она в 8 превращается. Или откуда там такие отсупы берутся...
(Добавление)
trot пишет:
Да действительно в РНР запоминается первое и последнее найденное совпадение.
Нет ничего такого в php. Если написать регулярку нормально - запоминаться будет всё.
(Добавление)
PHP:
скопировать код в буфер обмена
  1. preg_match_all('/([^{:}]+(?(?=})(?=})|(?=:)))/xs', $str, $m);
Вот такой вариант еще. Но без привязки к {{ }}
(Добавление)
И всё-таки preg_match_all + explode и будет хорошо.
14. movEAX - 21 Декабря, 2009 - 14:33:52 - перейти к сообщению
CODE (text):
скопировать код в буфер обмена
  1. $str =<<<XXX
  2.       <table width="100%" border="0" cellspacing="0" cellpadding="0">
  3.       <tr>
  4.       <td width="20" align="left" valign="middle"><input type="checkbox" name="test" id="test" /></td>
  5.       <td width="20" align="left" valign="middle">{{TEST}}</td>
  6.       <td width="50" align="left" valign="middle">{{TEST:123}}</td>
  7.       <td width="300" align="left" valign="middle">{{TEST:123:456}}</td>
  8.       <td align="left" valign="middle">{{TEST:123:456:789}}</td>
  9.       </tr>
  10.       <tr>
  11.       <td colspan="5" align="left" valign="top">msg</td>
  12.   </tr>
  13.       </table>
  14. XXX;
  15.  
  16. preg_match_all('!\{{2}(.+?)\}{2}!',$str, $str);
  17. $str = array_pop($str[1]);
  18. $str = explode(':',$str);
  19. print_r($str);
15. Вездеход - 21 Декабря, 2009 - 16:31:00 - перейти к сообщению
movEAX, да написать то я и сам могу..

Champion пишет:
И всё-таки preg_match_all + explode и будет хорошо.

да, я тоже уже на этом варианте остановился пока, хотя если получится с регуляркой - переписать будет не проблемой =)

 

Powered by ExBB FM 1.0 RC1