Forum Webscript.Ru

Программирование => PHP => Тема начата: Daiz13 от 01 Августа 2002, 10:07:12

Название: Регулярные выражения: поиск парных тегов
Отправлено: Daiz13 от 01 Августа 2002, 10:07:12
Написал такую ф-ю:


function getTagStr($content, $tag, $b_left="[", $b_right="]", $b_closer="/") {
    $b_left   = preg_quote ($b_left);
    $b_right  = preg_quote ($b_right);
    $b_closer = preg_quote ($b_closer);
    $patern = \'/\'.$b_left.$tag.$b_right.\'(.*)\'.$b_left.$b_closer.$tag.$b_right.\'/siU\';
    preg_match ( $patern , $content , $outdata);
    return $outdata[1];
}

// пример:
$body = getTagStr($content, "custom", $b_left="@", $b_right="@", $b_closer="")
 

Пример позволяет получить часть текста заключенную в @custom@.

А как ее переделать чтобы получать масив строк заключенных в произвольные теги?

Тоесть задаем только метки тэгов и ищем все парные тэги.
Название: Регулярные выражения: поиск парных тегов
Отправлено: Tronyx от 01 Августа 2002, 11:32:57
preg_match_all();
Название: Регулярные выражения: поиск парных тегов
Отправлено: Daiz13 от 01 Августа 2002, 14:19:30
Цитировать
preg_match_all();


Это итак ясно, проблема в том чтобы найти вхождения всех парных тэгов, а не какого н-дь определенного.
Название: Регулярные выражения: поиск парных тегов
Отправлено: AlieN от 01 Августа 2002, 15:50:20
Daiz13
я попытался поэксперементировать, немного изменив твою ф-ция - не удалось...
Скорее всего надо писать парсер
Название: Регулярные выражения: поиск парных тегов
Отправлено: Меняздесьдавнонет от 01 Августа 2002, 15:54:34
Ну, так это...
впесто слова $tag надо, наверное, написать .*?
Название: Регулярные выражения: поиск парных тегов
Отправлено: AlieN от 01 Августа 2002, 16:16:20
RomikChef
допусти текст вот такой:
[tag1]blabla1[tag2]blabla2[/tag2]blabla3[/tag1]
Что в итоге(с твои изменением) получим вот такие элементы массива:
1)blabla1[tag2]blabla2[/tag2]blabla3
2)blabla1[tag2]blabla2
3)blabla1
4)blabla2
5)blabla3
6)blabla2[/tag2]blabla3

Спрашивается: правильно ли?
Название: Регулярные выражения: поиск парных тегов
Отправлено: GotZfild от 01 Августа 2002, 17:24:59
preg_match_all("!\\\\[(.+)\\\\](.*)\\\\[/\\\\\\\\1\\\\]!U", $content, $outdata);
Только это не ищет вложенные теги, их придется выковыривать рекурсией.
Название: Регулярные выражения: поиск парных тегов
Отправлено: Меняздесьдавнонет от 01 Августа 2002, 18:01:26
Во! Уже ближе к телу!
Название: Регулярные выражения: поиск парных тегов
Отправлено: Ardzhan от 02 Августа 2002, 14:04:32
Вчера вводил такую фишку на свой форум... Реализовал так:
$msg=preg_replace("/\\[B\\](.*?)\\[\\/B\\]/i", "$1", $msg);
$msg=preg_replace("/\\[I\\](.*?)\\[\\/I\\]/i", "$1", $msg);
Знак "?" борется именно с
[tag1]blabla1[tag2]blabla2[/tag2]blabla3[/tag1]
и такого как blabla1[tag2]blabla2[/tag2]blabla3
 не вылетает... И со вложенными тегами работает, без проблем.
Название: Регулярные выражения: поиск парных тегов
Отправлено: Ardzhan от 02 Августа 2002, 14:08:04
Вопрос вдогонку, может кто знает...
Цитировать
(.*?)
- это допускает все символы, кроме перевода строки... Как сделать, чтоб допускался перевод строки...
Название: Регулярные выражения: поиск парных тегов
Отправлено: Макс от 02 Августа 2002, 16:09:50
там модификатор нужно прописать. Или m или s, точно не помню
Название: Регулярные выражения: поиск парных тегов
Отправлено: Ardzhan от 02 Августа 2002, 18:44:52
Макс
Проверил все ок... Как ты и говорил модификатор s ! Спасибо.
Название: Регулярные выражения: поиск парных тегов
Отправлено: Меняздесьдавнонет от 02 Августа 2002, 21:11:44
Вообще-то, если на КАЖДЫЙ тег писать прег реплейс, то, вообще-то, проще будет сделать strtr.
Название: Регулярные выражения: поиск парных тегов
Отправлено: Ardzhan от 02 Августа 2002, 23:27:21
Можно и str_replace... Но будет ли он проверять закрытие тега?