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 » Регулярные выражения » Переменная в шаблоне

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

1. LeKot - 22 Октября, 2008 - 08:18:16 - перейти к сообщению
есть задача: составить функцию, которая будет помещать текст между тегами в массив (тегов может быть несколько во входном параметре)
пример обращения:
CODE (text):
скопировать код в буфер обмена
  1.  Param2Hash($text,<h1><h2>)

тэги могут быть разными и в разном количестве. Сперва я вытащил прег_сплитом тэги из входящих параметров в массив
CODE (text):
скопировать код в буфер обмена
  1. function Param2Hash($text, $param)
  2. //нулевой и последний пустые - иметь в виду
  3. $arr = preg_split("/[<>]+/",$param);

теперь $arr содержит [,h1,h2,]
Далее я хотел циклом перебрать массив с 1 по каунт(массив)-1 примерно так
CODE (text):
скопировать код в буфер обмена
  1. preg_match_all("~<$arr[$i]> и т.д.~")
$i - счетчик цикла
Но веть он воспримет $arr не как ссылку на массив, а как просто набор литералов. то же самое, с счетчиком. + $ означает знак конца строки. Если экранировать доллар слэшем, то он не будет концом строки, но и указателем на переменную не будет Недовольство, огорчение Вот не знаю как быть
2. Champion - 22 Октября, 2008 - 08:42:30 - перейти к сообщению
LeKot пишет:
"~<$arr[$i]> и т.д.~"


Замените на '~<'.$arr[$i].'> итд'D общем все переменные вынесите из ковычек. А еще вроде можно так: $$var - тогда будет переменная
3. LeKot - 22 Октября, 2008 - 08:47:29 - перейти к сообщению
Спасибо, сейчас попробую Улыбка
(Добавление)
В принципе задача решена (алгоритм готов). Но синтаксически я где-то ошибся. Потому что код, представленный ниже выводит только:
Array ( [0] => Array ( ) [1] => Array ( ) ) Array ( [0] => Array ( ) [1] => Array ( ) [2] => Array ( ) [3] => Array ( ) ) Array ( [0] => Array ( ) [1] => Array ( ) [2] => Array ( ) [3] => Array ( ) [4] => Array ( ) [5] => Array ( ) )
А предпологалось "несколько" иное... Подскажите, где ошибка, пожалуйста.
CODE (text):
скопировать код в буфер обмена
  1. <html><body>
  2. <?php
  3.   //function Param2Hash($text, $param) // временно закомментировано
  4. $text = "<h1><b>Caption1</b></h1> some text <h2>Caption2</h2> <h3>Caption3</h3>"; // temp string
  5. $param = "<h1><h3>"; // temp string
  6. //нулевой и последний пустые - иметь в виду
  7. $arr = preg_split("/[<>]+/",$param);
  8. $i = 0;
  9. $return = array();
  10. while (++$i<count($arr))
  11. {
  12. preg_match_all('~<$$arr[$$i]>([0-9a-zA-Zа-яА-Я]*)[</$$arr[$$i]>]+~', $text, $tmp_array);
  13. $return = array_merge($return, $tmp_array);
  14. print_r($return); //temp string
  15. }
  16. ?></body></html>

(Добавление)
изменил строку регэкспра. вывод прежний. Нынешняя строка имеет следующий вид
CODE (text):
скопировать код в буфер обмена
  1. preg_match_all('~(<$$arr[$$i]>(.*)</$$arr[$$i])>~', $text, $tmp_array);
4. Champion - 22 Октября, 2008 - 10:37:56 - перейти к сообщению
LeKot пишет:
CODE (text):
скопировать код в буфер обмена
  1. '~<$$arr[$$i]>([0-9a-zA-Zа-яА-Я]*)'


'~<'.$arr[$i]'.>([0-9a-zA-Zа-яА-Я]*)'
или так
"~<$$arr[$$i]>([0-9a-zA-Zа-яА-Я]*)"
или даже так
"~<{$$arr[$$i]}>([0-9a-zA-Zа-яА-Я]*)"

чувствуете разницу?
(Добавление)
$str = 'asfe';
echo '$str'; //увидите $str
echo "$str"; ..увидите asfe
5. LeKot - 22 Октября, 2008 - 11:08:56 - перейти к сообщению
а все равно фигню выводит. даже с вот таким регэкспром
CODE (text):
скопировать код в буфер обмена
  1. preg_match_all("~{<".$arr[$i].">}([0-9a-zA-Zа-яА-Я]*){<\/".$arr[$i].">}~", $text, $return[$i]);
6. Champion - 22 Октября, 2008 - 11:45:54 - перейти к сообщению
1 - '~<'.$arr[$i]'.>([0-9a-zA-Zа-яА-Я]*)' так должно точно работать
2 - "~{<".$arr[$i].">}([ - я такого не писал
7. valenok - 22 Октября, 2008 - 13:04:21 - перейти к сообщению
implode('|',$arr) в самый первый вариант
8. LeKot - 22 Октября, 2008 - 16:31:20 - перейти к сообщению
2Champion на Ваш вариант ругаетсо, грит синтаксическая ошибка. На Ваш же, но доведённый до синтакс корректности выводит снова кучу вложенных в друг-друга массивов без значений.
А по второму Вы так и писали в варианте "или даже так" Улыбка
т.е. и моими регэкспрами и Вашими код "ловит" только пустые значения Недовольство, огорчение
UPD: массивы много потому, что я по дурости вывод в цикл положил. вытащенный из цикла вывод дает следующий результат: Array ( [0] => Array ( ) [1] => Array ( ) ) с любыми кавычками и двумя долларами, для экранирования переменной. С кавычками перед/после переменной ругается на синтаксис.
(Добавление)
2valenok, Спасибо ) от цикла можно избавиться теперь Улыбка
9. Champion - 22 Октября, 2008 - 16:54:24 - перейти к сообщению
LeKot пишет:
А по второму Вы так и писали в варианте "или даже так"

Сравните внимательнее) - то что я написал - всё в двойных апострофах

 

Powered by ExBB FM 1.0 RC1