Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярное выражение, обход цитирования 
:(
    Опции темы
Hellka
Дата 23.9.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 2.2.2006

Репутация: нет
Всего: нет



в общем возникла задачка пропарсить посты на форуме на предмет ссылок, НО ссылки в блоках цитирования учитывать нельзя. парсер я написал и решил перед тем как анализировать пост, выкинуть из него все блоки цитирования (а точнее текст в блоках). но возникла проблема с составлением шаблона.
если бы цитирование было вида [q] тест [/q]  или посложнее:

[q] тест
    [q] тест 
        [q] тест [/q]
    [/q]
 [/q]


то можно было бы посчитать количество открывающихся тегов, создать циклом шаблон и вырезать весь текст между тегами

а если цитирование такое:


[q] тест
    [q] тест  [q] тест [/q]
        [q] тест [/q]
    [/q]    [q] тест [/q]
 [/q]

то уже не канает. можно конечно перебирать весь текст на наличие открытых закрытых тегов и составлять на его основе шаблон, но мне кажется, что это уже быдлокодерством попахивает, нкто не знает, как решить эту проблему так сказат более изящнее?))
PM MAIL   Вверх
brother79
Дата 23.9.2009, 11:41 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 471
Регистрация: 18.8.2009

Репутация: 2
Всего: 6



Вырежи цитирование циклом регуляркой типа

Код

preg_replace('/\[q\][^\[]*\[\/q\]/', '', $text);


несколько раз, а потом также регуляркой вылавливай ссылки


--------------------
PM MAIL WWW   Вверх
Hellka
Дата 23.9.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 2.2.2006

Репутация: нет
Всего: нет



Цитата(brother79 @  23.9.2009,  11:41 Найти цитируемый пост)
Вырежи цитирование циклом регуляркой типа

[q] тест
    [q] тест  [q] тест [/q]
        [q] тест [/q]
    [/q]    [q] тест [/q]
 [/q]

с таким вариантом не справится
PM MAIL   Вверх
patap
Дата 23.9.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



а ну такой попробуй
Код

(?:\[q\])([^\[]*)(?:\[\/q])?


Это сообщение отредактировал(а) patap - 23.9.2009, 13:02


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
sTa1kEr
Дата 23.9.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Код

$str = <<< EOS
begin
[notq] notq content [/notq]
[q] quote level 1 [a]link[/a]
    [q] quote level 2 [q] quote level 3 [/q]
        [q] quote level 3 [phpcode]<?php ?>[/phpcode] [/q]
    [/q] [q] quote level 2 [/q]
 [/q] some outside q [q] quote level 1 [/q]
end

EOS;

// Открывающий quote тег
$oq = '\[q\]';
// Закрывающий quote тег
$cq = '\[\/q\]';
// Любой символ, кроме символа открывающего тег [q] или [/q]
$nq = '(?> [^\[] | \[(?! \/?q\] ) )';
// Шаблон использующий рекусию
$pattern = "/ $oq (?> $nq+ | (?R) )+ $cq /xsi";

preg_match_all($pattern, $str, $m);
var_dump($m);
var_dump(preg_replace($pattern, '', $str));

Код

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(165) "[q] quote level 1 [a]link[/a]
    [q] quote level 2 [q] quote level 3 [/q]
        [q] quote level 3 [phpcode]<?php ?>[/phpcode] [/q]
    [/q] [q] quote level 2 [/q]
 [/q]"
    [1]=>
    string(22) "[q] quote level 1 [/q]"
  }
}
string(45) "begin
[notq] notq content [/notq]
 some outside q 
end
"


Добавлено через 5 минут и 58 секунд
Регулярки - это сила! smile 

Это сообщение отредактировал(а) sTa1kEr - 23.9.2009, 13:03
PM MAIL   Вверх
sTa1kEr
Дата 23.9.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



По просьбе ТС, слегка изменил регулярку и прокомментировал.
Код

/**
 * Открывающий тег
 */
define('OPEN_TAG', '<!-- QuoteBegin -->');

/**
 * Закрывающий тег
 */
define('CLOSE_TAG', '<!-- QuoteEnd -->');

// Первый символ тега
$openFC = preg_quote(substr(OPEN_TAG, 0, 1), '/');

// Первый символ тега
$closeFC = preg_quote(substr(CLOSE_TAG, 0, 1), '/');

// Остальная часть открываюего тега
$openContent = preg_quote(substr(OPEN_TAG, 1), '/');

// Остальная часть закрывающего тега
$closeContent = preg_quote(substr(CLOSE_TAG, 1), '/');

// Открывающий тег целиком
$open = $openFC.$openContent;

// Закрывающий тег целиком
$close = $closeFC.$closeContent;

$firstChars = $openFC == $closeFC ? $openFC : $openFC.$closeFC;

// Любой символ, кроме первого символа тега
// или первый символ тега, за которым НЕ следуют
// остальная часть открывающего или закрывающего тегов
$notTag = "(?>[^$firstChars]|$openFC(?!$openContent)|$closeFC(?!$closeContent))";

// Шаблон использующий рекурсию
$pattern = "/$open(?>$notTag+|(?R))+$close/si";

preg_match_all($pattern, $str, $m);
// ...


Это сообщение отредактировал(а) sTa1kEr - 23.9.2009, 15:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.