Показать полную графическую версию : регулярные выражения
Prisoner
05-02-2005, 03:41
Ginger, можно и через htaccess:
Директивы php_value и php_admin_value используются для определения значения переменной.
Форма записи:
php_value имя_переменной значение
php_admin_value имя_переменной значение
Директиву php_admin_value можно использовать только в конфигурационных файлах Apache, а php_value - и в файлах .htaccess
Пример:
php_value include_path "/home/user-www/includes"
На счет усложнения можно так:
$searches = array("[\']","'<h[4-5][^>]*?>'si","'</h[4-5]>'is","'<h[1-3][^>]*?>'si","'</h[1-3]>'si","'<hr[^>]*?>'si", '/(?<!pre) (class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si');
$replaces = array("`" ,"<h4>" ,"</h4>" ,"<h3>" ,"</h3>" ,"<hr size=\"1\">","");
Естественно, нужно предусмотреть ситуацию когда между pre и class|style есть любые допустимые символы, а не один пробел (сделано, чтобы не загромождать паттерн)
mozhet togda:
'/(?<!pre)?(\w+)(class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si'
??
Prisoner
08-02-2005, 14:22
Кажется \w как раз не учитывает пробелы (это учет букв, цифр и подчеркивания). Сейчас проверить не могу, но думается, так:
'/(?<!pre)((\s+)(\w+)(\s+))?(class|style)(\s+)?=(\s+)?(\"|\\\"|\'|\`|\\\`)?(\w+)(\"|\\\"|\'|\`|\\\`)?/si'
vadimiron
а есть какаенибудь мануалка офлайн вида у тебя,
где описаны все операнды для регулярных выражений?
очень был бы благодарен.
Prisoner
09-02-2005, 08:06
Ginger, нет, некорректно работает :\. Не силен я в регулярках. Где же господа профи?
vadimiron, присоединяюсь к просьбе FADE.
Vlad Drakula
09-02-2005, 22:24
Ginger
а... тебе нужно редактировать php.ini ???
стукни мне в аску и я объясню как это сделать...
Vlad Drakula
09-02-2005, 22:29
Ginger
так... ты можешь привести пример того что дано и того что нужно получить???
Vlad Drakula
09-02-2005, 22:31
мне на время дали почитать шикарную книгу по регулярным выражениям, могу засканировать....
Vlad Drakula о, давай отскань)
а я в свою очередь смогу через фанридер пропутить) ток скань больше или равно 300 диоптриям, иначе не переведет)
vadimiron, а вообще у тебя есть шанс еще стаьтю написать типа модуля рерайт к апачу) мы ее прикрепим и подобное)
vadimiron
10-02-2005, 01:55
Сори, что не отвечаю, у меня сейчас экзамены, но 19 всё кончится и я буду свободен, тогда смогу написать статью и про реврайт, и про регулярки
а пока могу пару сайтов подбросить, может кому пригодиться:
первый (http://www.regular-expressions.info/)
второй (http://regexlib.com/) третий (http://www.webreference.com/programming/php/regexps/)
не надо мне ИНИ редактироват'.
даже если и надо было бы, то я не раз ето делала
Призонер просто для потомков об'ясняет.
то что нужно сделат':
удалят' style и class везде кроме тага <pre>
все ж аррей
сабмитится через форму и POST
FADE, Prisoner
Книга по регулярным выражениям:
Jeffrey Friedl - Mastering Regular Expressions (англ. язык)
http://linuxland.itam.nsc.ru/cgi-bin/download/c.cgi?eng/ps/Mastering_Regular_Expressions.pdf.gz
Есть перевод, вышедший в издательстве Питер. За переводом - в книжный магазин.
Vlad Drakula
12-02-2005, 11:26
mrcnn
1) ссылка битая, т.е. не битая, но скачать не дает...
2) у меня есть Jeffrey Friedl - Mastering Regular Expressions от издательства Питер причем второе издание...
3) но ничего я нашол эту книгу в EDK скоро скачаю... потом может где выложу...
а на руском есть что у кого?)
Vlad Drakula
12-02-2005, 23:58
E-mail
у меня есть эта книнига на русском, но только она бумажная...
я завтра постараюсь не забыть посмотреть в своих отвалах разных док... может что найду...
но честно говоря, учить английский надо, учить!!!
На русском регулярные выражения очень хорошо описываются в книге "Learning Perl"(llama book, русское название - "Изучаем Perl"). Глава 7, http://webcraft.dem.ru/Perl1/g7.html
Описание регулярных выражений оттуда применимо и к php, потому что в нем поддерживаются PCRE (PERL compatible regualar expressions).
Исключение составляют использование в коде, в Perl-е для регулярных выражений не требуется использование функции:
Ср.
--поиск
Perl
if ($text=~/foo/)
;
PHP
if (preg_match('/foo/',$text))
;
--замена
Perl
if ($string=~s/foo/bar/)
;
PHP
if (preg_replace('/foo/','/bar/', $text)
;
Возник вопросик. Надеюсь на помощь гуру. Есть примерно следующий код на Perl:
#!/usr/bin/perl
use strict;
use locale;
use CGI qw(-no_xhtml -nosticky :standard);
...
my $result = "Some user multiline input:...";
$result =~ s/^(.+?:)/strong($1)/gmeo;
...
Вопрос, собственно, в безопасности подобной конструкции. Не сможет ли пользователь выполнить команду операционной системы, или совершить другие подобные деструктивные действия, введя определенные данные (что-нибудь типа system('...'))? Если да, то как этого избежать? Понимаю, что s/^(.+?:)/<strong>$1<\/strong>)/gm; избавляет меня от сомнений, но такой вариант меня не вполне устраивает.
Спасибо.
по моей просьбе было предложено следующее:
$text = preg_replace("#<pre>(.*)\r\n(.*)</pre>#","<pre>\\1<br>\\2</pre>",$text);
$text = preg_replace("'([\r\n])[\s]+'"," ",$text);
$text = preg_replace("#<pre>(.*)<br>(.*)</pre>#","<pre>\\1\r\n\\2</pre>",$text); (мне правда не понятно зачем это...)
но как vadimiron говорил так весь текст будет собиратся и хранится ж переменной.
а тексты болшие..
есть идеи по улучшению?
вот работающий код:
$pres = array(); $i = 0;
$text = preg_replace('{(<pre[^>]*?>.*</pre>)}Uesi','"UnrealPRE$i".(($pres[$i++]="$1")?"":"")', $text);
$text = preg_replace("'([\r\n])[\s]+'"," ",$text);
$done = false;
while (!$done)
{ $ch1 = strlen($text);
$text = str_replace(" "," ",$text);
$ch2 = strlen($text);
if ($ch1==$ch2) {$done=true;} else {$done=false;}
}
$text = preg_replace('/UnrealPRE(\d+)/e', '$pres[$1]', $text);
единственный его баг (который выявлен на даный момент) - он вырезает слова содеержащие знак $ и сам знак отдельно.
А вчём раздичие ereg и preg_match?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.