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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с регулярным выражением 
:(
    Опции темы
dm9
Дата 14.1.2005, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Использую PCRE.

Как можно описать такую штуку: "любая строка, внутри которой не содержится подстрока 'qweqweqwe'"?

smile

PM MAIL ICQ   Вверх
Mal Hack
Дата 14.1.2005, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



(^qweqweqwe)
PM ICQ   Вверх
dm9
Дата 14.1.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Хм.

А можешь написать ф-цию для замены на "!" подстрок "12<что-то>34" строки "12qwe34 12rty34 12uio34". Условие замены - <что-то> не содержит строку "qwe" и не содержит пробелов.

То есть надо получить "12qwe34 ! !"
Добавлено @ 23:37
Точнее, не ф-цию, а рег. выражение.
PM MAIL ICQ   Вверх
Mal Hack
Дата 14.1.2005, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Код

<?php

$str = "12qwe34 12rty34 12uio34";
$str = preg_replace( "#(\d+[^qwe^\s]+?\d+)#U" , "!" , $str );
print $str;

?>

PM ICQ   Вверх
dm9
Дата 15.1.2005, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Mal Hack, твоё выражение не заменит строку 12ewq34.

Мне надо именно строку qwe, а не три символа q, w, e.
PM MAIL ICQ   Вверх
Mal Hack
Дата 15.1.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Код

<?php

function repl( $full , $str )
 {
  if( $str != "qwe" )
   {  return "!";  }
  else
   {  return $full;  }
 }

$str = "12qwe34 12rty34 12ewq34";

$str = preg_replace( "#\d+([^\d]+)\d+#e" , "repl( \"\\0\" , \"\\1\" )" , $str );

print $str;

?>

PM ICQ   Вверх
dm9
Дата 15.1.2005, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Понял, спасибо.
PM MAIL ICQ   Вверх
Mal Hack
Дата 15.1.2005, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Стоп. Наврал...
"#\d+([^\d]+)\d+#e"
Надо:
"#\d+([^\d^\s]+)\d+#e"

Это сообщение отредактировал(а) Mal Hack - 15.1.2005, 00:26
PM ICQ   Вверх
dm9
Дата 15.1.2005, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Не важно, я понял. Я думал, можно без ф-ции обойтись как-то.
PM MAIL ICQ   Вверх
Mal Hack
Дата 15.1.2005, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Вот так... "#\d+(\w+?)\d+#e"
Сорри smile
Че-то глючу уже...

PM ICQ   Вверх
dm9
Дата 15.1.2005, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



В смысле, без доп. ф-ции repl.

Это сообщение отредактировал(а) dm9 - 15.1.2005, 00:29
PM MAIL ICQ   Вверх
Mal Hack
Дата 15.1.2005, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(dm9 @ 15.1.2005, 00:28)
В смысле, без доп. ф-ции repl.

не получится, т.к. ^ отрицание не применимо к (), а только к классам [], а это - набор, а не последовательность.
PM ICQ   Вверх
Secandr
Дата 15.1.2005, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



а что если просто проверять есть ли эта строка?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
dm9
Дата 15.1.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Не понимаю. Если применительно к вышеуказанному примеру, какой предложишь код?
PM MAIL ICQ   Вверх
Secandr
Дата 15.1.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



Цитата(dm9 @ 15.1.2005, 00:22)
Как можно описать такую штуку: "любая строка, внутри которой не содержится подстрока 'qweqweqwe'"?

Код

foreach($string as $v){
if (stripos($v,'qweqweqwe')===false){print $v."\n";}
}



--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Mal Hack
Дата 15.1.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(Secandr @ 15.1.2005, 14:03)
stripos

Только PHP5.
PM ICQ   Вверх
Secandr
Дата 15.1.2005, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



Mal Hack не принципиально, идея понятна?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Mal Hack
Дата 15.1.2005, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Secandr
у него же там числа вокруг, и я так понимаю, что числа могут быть разные... Это все-таки он как пример дал.
PM ICQ   Вверх
Secandr
Дата 15.1.2005, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



смысл: ищем строку содержащую бла бла бла, а в условии ставим не smile


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
dm9
Дата 15.1.2005, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



На самом деле, полностью задачу можно поставить так:

Вычленить блоки, начало которых такое:
{IF LALALA}
Конец такой:
{ENDIF}
И при этом чтобы не было пересечений, то есть надо задать рег. выражение так, чтобы между началом и концом блока не появилось начала другого блока (блоки вложенными быть не могут).

Смотреть отсуствие открываеющейся фигурной скобки не катит, так как внутри блока могут быть выражения вида {=VALUE}.

Как все догадались, пишу парсер шаблонов...
PM MAIL ICQ   Вверх
Secandr
Дата 15.1.2005, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



У нас кто-то занимался уже подобным. Или мутоген или изатоп, можно у них спросить.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
dm9
Дата 15.1.2005, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Изатоп этим занимался и Мастер ещё.

Просто хочется своё написать, чтобы язык прочувствовать. Я на PHP мало программировал.

Вообще, удивлён, что в PCRE нет такой фичи.
PM MAIL ICQ   Вверх
IZ@TOP
Дата 15.1.2005, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Цитата(dm9 @ 15.1.2005, 17:34)
{IF LALALA}
Конец такой:
{ENDIF}

Я это делал так:

Код
function FindCondition() {      // Поиск шаблонных условий.
            // Регулярное выражение для поиска условий в шаблоне.
 $Preg = "|{if\s?%?([a-zA-Z0-1_.]*?)%?\s+?([=!<>]*?)\s?%?([a-zA-Z0-1_.]*?)%?}(.*?){endif}|si";
            // При нахождении консрукций шаблонных условий они заносятся в массив ConditionMatches.
 preg_match_all($Preg, $this->Document, $this->ConditionMatches);
 if(!isset($this->ConditionMatches[0][0])) return false;
 return true;
}

Но в этой функции можно еще потом и {elseif} использовать.
Добавлено @ 16:45
Условия потом парсились таким методом:

Код
function CompileCondition(&$Template) {
            // найти все вхождения конструкций шаблонных условий.
 if(!$Template->FindCondition()) return false;
 if(sizeof($Template->ConditionMatches[0]) < 1) return true;
 for($i = 0; $i < sizeof($Template->ConditionMatches[0]); $i++) {
            // Если в условных блоках шаблона не встречаются блоки "или":
  if(!strpos($Template->ConditionMatches[4][$i], '{elseif}')) {
            // Разбор условий на составляющии и их обработка.
   $l = addslashes(trim($Template->ConditionMatches[1][$i]));
   $c = addslashes(trim($Template->ConditionMatches[2][$i]));
   $r = addslashes(trim($Template->ConditionMatches[3][$i]));
   if(isset($Template->Variables[$l])) {
    $l = $Template->Variables[$l];
   } else {
    $l = 'null';
   }
   if(isset($Template->Variables[$r])) {
    $r = $Template->Variables[$r];
   }
   if(eval('if("'.$l.'" '.$c.' "'.$r.'") { return true; } else { return false; }')) {
    $Template->Document = str_replace($Template->ConditionMatches[0][$i], $Template->ConditionMatches[4][$i], $Template->Document);
   } else {
    $Template->Document = str_replace($Template->ConditionMatches[0][$i], '', $Template->Document);
   }
  } else {        // Если в условных блоках шаблона встречаются блоки "или":
            // Разбор условий на составляющии и их обработка.
   $l = addslashes(trim($Template->ConditionMatches[1][$i]));
   $c = addslashes(trim($Template->ConditionMatches[2][$i]));
   $r = addslashes(trim($Template->ConditionMatches[3][$i]));
   if(isset($Template->Variables[$l])) {
    $l = $Template->Variables[$l];
   } else {
    $l = 'null';
   }
   if(isset($Template->Variables[$r])) {
    $r = $Template->Variables[$r];
   }
   $ex = explode('{elseif}', $Template->ConditionMatches[4][$i]);
   if(eval('if("'.$l.'" '.$c.' "'.$r.'") { return true; } else { return false; }')) {
    $Template->Document = str_replace($Template->ConditionMatches[0][$i], $ex[0], $Template->Document);
   } else {
    $Template->Document = str_replace($Template->ConditionMatches[0][$i], $ex[1], $Template->Document);
   }
  }
 }
}



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
dm9
Дата 15.1.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Цитата(IZ @ 15.1.2005, 16:42)
[a-zA-Z0-1_.]


А зачем так делать? Точка же - это любой символ, она включает всё остальное.


Вообще, не понимаю, как это работает. Я пробовал делать таким образом, правда, сразу с preg_replace. У меня из-за этого:

Цитата(IZ @ 15.1.2005, 16:42)
[a-zA-Z0-1_.]*


выдавалась вся строка целиком между мервым IF и последним ENDIF, и всё. Чуть позже получше поразбираюсь с этим выражением...

Добавлено @ 17:01
Точнее, я не так пробовал, а так:
[.]*
PM MAIL ICQ   Вверх
IZ@TOP
Дата 15.1.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



dm9, точку убери, это я непомню, но зачем то вставлял. У меня все на ура работает.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Secandr
Дата 15.1.2005, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



точка в [] означает просто точку!


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Mal Hack
Дата 15.1.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Secandr
Точка это любой символ, даже в классе... Просто точка \.
PM ICQ   Вверх
Secandr
Дата 15.1.2005, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



[.] - сивол точка
(.) - любой символ


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0725 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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