Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

регулярка для выбора тегов

13
16 ноября 2006 года
RussianSpy
3.0K / / 04.07.2006
Несмотря на большой опыт веб-разработок - регулярки по сей день остаются моим слабым местом. Прошу помощи у любимого форума.
Итак. Есть некий код со вставленными "псевдо-тегами":
 
Код:
<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
2
16 ноября 2006 года
squirL
5.6K / / 13.08.2003
язык то какой? на Perl впринципе я бы такое тебе сделал...
12
16 ноября 2006 года
alekciy
3.0K / / 13.12.2005
Я думаю, что не стоит тут городить забор из регулярок, ибо куча их тут нафиг не нужна. Я бы сделал так:
Код:
<?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);
?>

Т.е. скрипт анализирует файл index.htm который находится с ним в одной директории. Существует одно ограничение: значения атрибутов этих псевдо-тегов НЕ должны содержать пробел.

А насчет понимания регулярок... крайне рекомендую прочесть вот эти две части статьи:
http://phpclub.ru/detail/article/regexp_1
http://phpclub.ru/detail/article/regexp_2
13
17 ноября 2006 года
RussianSpy
3.0K / / 04.07.2006
язык РНР.
Решил я сам таким образом:
Первая регулярка - дергаем из кода все "псевдотеги":
 
Код:
\[:.*:\]

Вторая - получаем имя тега:
 
Код:
(?<=:)[a-zA-Z]*(?=\s)

Третья - получаем параметры:
 
Код:
[\w]+=[\"|\']+[^> ]+[\"|\']


Может и не совсем красиво - но работает

2alekciy: статьи эти видел и толку от них не очень много. Мне сильно помогла известная книжечка издательства O'Reilly "Mastering Regular Expressions. 2nd Edition" (если кому надо - могу поделится - это практически библия регэкспов, бестселлер).
12
17 ноября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=RussianSpy]язык РНР.
Решил я сам таким образом:
[/QUOTE]
Если знаешь как сделать, зачем спрашивать? ;)

[QUOTE=RussianSpy]
Может и не совсем красиво - но работает
[/QUOTE]
Кравость это все фигня. А вот скорость... как известно регулярки работают долше прочих функций и обычно их рекомендуют избегать (по крайней мере в PHP) если требуемый функционал может быть реализован другими функциями.

[QUOTE=RussianSpy]
2alekciy: статьи эти видел и толку от них не очень много.
[/QUOTE]
Каждому свое, но лучше чем эта статья я лично не ведел больше. И не я один. О книгах судить не берусь, однако если
Цитата:
регулярки по сей день остаются моим слабым местом.


, то видимо книга не настолько крута, как тебе кажется. Имхо.

13
17 ноября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=alekciy]Если знаешь как сделать, зачем спрашивать? ;)[/QUOTE]
Когда спрашивал - не знал

Цитата:

Кравость это все фигня. А вот скорость... как известно регулярки работают долше прочих функций и обычно их рекомендуют избегать (по крайней мере в PHP) если требуемый функционал может быть реализован другими функциями.


В данном контексте этим можно пренебречь

Цитата:

Каждому свое, но лучше чем эта статья я лично не ведел больше.


А может ты плохо искал? Подумай об этом.

Цитата:
О книгах судить не берусь, однако если, то видимо книга не настолько крута, как тебе кажется. Имхо.


"Слабое место" и "начинающий чайник" - разные вещи. Во всяком случае ты работающего способа не предложил.
Это например меня вообще удивило:

Цитата:
$tag = substr($val, 2, strlen($val)-4);

- а кто сказал что длина тега именно 4 символа, а не 8 или 12 или 3? Даже в моем вопросе их два разных... В общем вопрос решен. Тема закрыта.

12
17 ноября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=RussianSpy]
"Слабое место" и "начинающий чайник" - разные вещи. Во всяком случае ты работающего способа не предложил.
[/QUOTE]
Странно... у меня работает, у тебя нет?

[QUOTE=RussianSpy]
Это например меня вообще удивило: - а кто сказал что длина тега именно 4 символа, а не 8 или 12 или 3?[/QUOTE]
А кто сказал, что там идет вырезка тега? Если не видишь логики работы, не спеши осуждать. Данная строка вырезает [: и :] .
12
17 ноября 2006 года
alekciy
3.0K / / 13.12.2005
Кстати, если есть сомнения в работе см. работающий пример: http://alekciy.ru/bufer/pseudo_tags.php парсит вот это http://alekciy.ru/bufer/index.htm
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог