<b>This is official site of company</b>
<p class="p2'>bla-bla-bla</p><img src="[:IMG SRCID="162" ACCESSTYPE="4" ALT="Our logo":]">
<br><br>
[:MENU ID="17" MAINTMPL="/templates/menu/t17.php" SHOWTITLE='NO':]
регулярка для выбора тегов
Итак. Есть некий код со вставленными "псевдо-тегами":
Код:
По сути это некий "полуфабрикат" хтмл страницы, в которую нужно вставить код на места меток вроде [:MENU .....:].
Задача: имеем такой код - необходимо вычленить из него с помощью регулярки все "псевдотеги" и получить массив вроде:
Код:
[0]
['TAG']=[:MENU ID="17" MAINTMPL="/templates/menu/t17.php" SHOWTITLE='NO':]
['NAME']="MENU"
['ID']=17
['MAINTMPL']="/templates/menu/t17.php"
['SHOWTITLE']='NO'
[1]
['TAG']="[:CONTENT TYPE='3']"
['NAME']="CONTENT"
['TYPE']=3
['TAG']=[:MENU ID="17" MAINTMPL="/templates/menu/t17.php" SHOWTITLE='NO':]
['NAME']="MENU"
['ID']=17
['MAINTMPL']="/templates/menu/t17.php"
['SHOWTITLE']='NO'
[1]
['TAG']="[:CONTENT TYPE='3']"
['NAME']="CONTENT"
['TYPE']=3
язык то какой? на Perl впринципе я бы такое тебе сделал...
Код:
<?php
$file = file_get_contents('index.htm');
$pseudo_tags = Array();
$arr = Array();
$string = '/(\[:).+(:\])/i';
preg_match_all($string,$file,$pseudo_tags);
foreach($pseudo_tags[0] as $key => $val) {
$tag = substr($val, 2, strlen($val)-4);
$component = explode(' ',$tag);
$arr[$key] = array('TAG' => $val, 'NAME' => $component[0]);
foreach ($component as $k => $v) {
if ($k != 0) {
$attribute = explode('=',$v);
$arr[$key] += array($attribute[0] => substr($attribute[1],1,strlen($attribute[1])-2));
};
};
};
print_r($arr);
?>
$file = file_get_contents('index.htm');
$pseudo_tags = Array();
$arr = Array();
$string = '/(\[:).+(:\])/i';
preg_match_all($string,$file,$pseudo_tags);
foreach($pseudo_tags[0] as $key => $val) {
$tag = substr($val, 2, strlen($val)-4);
$component = explode(' ',$tag);
$arr[$key] = array('TAG' => $val, 'NAME' => $component[0]);
foreach ($component as $k => $v) {
if ($k != 0) {
$attribute = explode('=',$v);
$arr[$key] += array($attribute[0] => substr($attribute[1],1,strlen($attribute[1])-2));
};
};
};
print_r($arr);
?>
Т.е. скрипт анализирует файл index.htm который находится с ним в одной директории. Существует одно ограничение: значения атрибутов этих псевдо-тегов НЕ должны содержать пробел.
А насчет понимания регулярок... крайне рекомендую прочесть вот эти две части статьи:
http://phpclub.ru/detail/article/regexp_1
http://phpclub.ru/detail/article/regexp_2
Решил я сам таким образом:
Первая регулярка - дергаем из кода все "псевдотеги":
Код:
\[:.*:\]
Вторая - получаем имя тега:
Код:
(?<=:)[a-zA-Z]*(?=\s)
Третья - получаем параметры:
Код:
[\w]+=[\"|\']+[^> ]+[\"|\']
Может и не совсем красиво - но работает
2alekciy: статьи эти видел и толку от них не очень много. Мне сильно помогла известная книжечка издательства O'Reilly "Mastering Regular Expressions. 2nd Edition" (если кому надо - могу поделится - это практически библия регэкспов, бестселлер).
Решил я сам таким образом:
[/QUOTE]
Если знаешь как сделать, зачем спрашивать? ;)
[QUOTE=RussianSpy]
Может и не совсем красиво - но работает
[/QUOTE]
Кравость это все фигня. А вот скорость... как известно регулярки работают долше прочих функций и обычно их рекомендуют избегать (по крайней мере в PHP) если требуемый функционал может быть реализован другими функциями.
[QUOTE=RussianSpy]
2alekciy: статьи эти видел и толку от них не очень много.
[/QUOTE]
Каждому свое, но лучше чем эта статья я лично не ведел больше. И не я один. О книгах судить не берусь, однако если
Цитата:
регулярки по сей день остаются моим слабым местом.
, то видимо книга не настолько крута, как тебе кажется. Имхо.
Когда спрашивал - не знал
Цитата:
Кравость это все фигня. А вот скорость... как известно регулярки работают долше прочих функций и обычно их рекомендуют избегать (по крайней мере в PHP) если требуемый функционал может быть реализован другими функциями.
В данном контексте этим можно пренебречь
Цитата:
Каждому свое, но лучше чем эта статья я лично не ведел больше.
А может ты плохо искал? Подумай об этом.
Цитата:
О книгах судить не берусь, однако если, то видимо книга не настолько крута, как тебе кажется. Имхо.
"Слабое место" и "начинающий чайник" - разные вещи. Во всяком случае ты работающего способа не предложил.
Это например меня вообще удивило:
Цитата:
$tag = substr($val, 2, strlen($val)-4);
- а кто сказал что длина тега именно 4 символа, а не 8 или 12 или 3? Даже в моем вопросе их два разных... В общем вопрос решен. Тема закрыта.
"Слабое место" и "начинающий чайник" - разные вещи. Во всяком случае ты работающего способа не предложил.
[/QUOTE]
Странно... у меня работает, у тебя нет?
[QUOTE=RussianSpy]
Это например меня вообще удивило: - а кто сказал что длина тега именно 4 символа, а не 8 или 12 или 3?[/QUOTE]
А кто сказал, что там идет вырезка тега? Если не видишь логики работы, не спеши осуждать. Данная строка вырезает [: и :] .
Кстати, если есть сомнения в работе см. работающий пример: