Заменяем ereg на preg_match
В PHP 5.3 разработчки решили, наконец, избавиться от POSIX регулярных выражений - в самом деле, зачем нужны две библиотеки для работы с регулярными выражениями, если можно обойтись одной? К тому же, POSIX регулярные выражения гораздо медленнее чем Perl совместимые регулярные выражения (PCRE).
Теперь, разработчики в срочном порядке исправляют свой код, заменяя функции ereg, eregi, ereg_replace, ereg_replacei соответствующими PCRE аналогами, благо, замена получилась довольно простой:
1. заменить ereg и eregi на preg_match, ereg_replace и ereg_replacei на preg_repalce;
2. добавить // разделители в начало и конец регулярного выражения;
3. если POSIX функция кончается на i (eregi, ereg_replacei) то добавить i в конец регулярного выражения после разделителя.
4. заменить POSIX спецсимволы соответствуюущими PCRE аналогами: [:alnum:]
- \w или [0-9a-z], [:digit:] - \d или [0-9], [:space:] - \s, [:alpha:] - [a-z]
примеры:
ereg('expression') -> preg_match('/expression/')
eregi('expression') -> preg_match('/expression/i')
eregi('^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$
') -> preg_match('/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$
/i')
Upd: оказывается шаг четвертый не обязателен - спецсимволы типа [[:alnum:]] теперь поддерживаются в PCRE!
разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться
комментарии:
классный у тебя сайт)))
Спасибо, вы очень мне помогли! :)
Спасибо!!! Для меня, как ничего не понимающего в php, здорово помогло.))))
Спасибо! Предельно ясно написано!
Подскажите пожалуйста, переписываю скрипт с этими изменениями и выскакивает ошибка.
Прежняя строка выглядела так:
if( ereg( $sVariable."\['".$sKey."'\]", $aFile[$i] ) && ereg( '=', $aFile[$i] ) ){
Новая строка, в соответствии с тем, что Вы написали стала такой:
if( preg_match($sVariable.'/\['/'.$sKey.'/'\]'/, $aFile[$i] ) && preg_match( '/=/', $aFile[$i] ) ){
выскакивает ошибка:
Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in W:\home\test1.ru\www\shop\core\common-admin.php on line 117
Что делать? Помогите, пожалуйста.
>Подскажите пожалуйста, переписываю скрипт с этими изменениями и выскакивает ошибка.
Думаю, должно быть что то вроде:
if(preg_match("/".$sVariable."\['".$sKey."'\]/", $aFile[$i]) && preg_match('/=/', $aFile[$i])){
Хотя, я бы вообще не использовал тут регулярные выражения - в данном случае задача сводится к тривиальному поиску подстроки в строке, а для этого использовать регулярные выражения слишком кудряво, лучше и быстрее будет использовать функцию strpos:
if (strpos($aFile[$i],$sVariable."['".$sKey."']")!==false && strpos($aFile[$i], '=')!==false ){
Спасибо огромное! Помогло!
Спасибо - помогло перейти с ereg на preg_match
Благодарствую! Полезно! :)
ДОбрый день!
ну, наконец-то нашел... Пожалуёста, помогите. Сайт стоит на сревере, выдается ошибка - обновили РНР они. Писбма с сервера через сайт не идут (например, сообщение о комментарии)
Вот функция
function check_uri($uri) {
if (ereg("@",$uri)) {
$uri="mailto:".$uri;
}
return $uri;
}
Нисколько не понимаю в РНР. буду очень признателен - с меня ссылка на Ваш блог)
Я бы сделал вот так:
function check_uri($uri) {
if (strpos($uri,"@")!==false) {
$uri="mailto:".$uri;
}
return $uri;
}
Благодарю!
Спасибо, помогло. Ещё ссылка по теме: http://www.pcre.ru
помогите переделать код пожалуйста
Ирек Минигулович: Ну согласно описанному выше строчка с eregi будет выглядеть как:
if ( preg_match( "/bmp|gif|jpg|png|jpeg/i", $file ) && is_file( $i_f ) ) {
Привет!
меня тоже интересует эта история с разделителями.
С eregi() это работало:
if (eregi("(http|://|www|href|/a|blablabla)", $msg)) {echo "такая фигня тут не нужна"; exit;}
для preg_match() что исправить?
Марина - не понимаю как это должно работать - если в строке $msg будет "http" или "://" или "www"... то вылетаем с ошибкой? Как-то странно плучается, может вы хотели сделать чтобы удалялись из текста все гипессылки в каноническов формате?
я не тестировал но если тот вариант что вы прислали правильный по-моему должен вполне сработать следующий код:
if (preg_match("/(http|://|www|href|/a|blablabla)/i", $msg)) {echo "такая фигня тут не нужна"; exit;}
Спасибо!
Спасибо, max!
попробую!
Да, нужно чтоб выдавало именно ошибку, точнее - чтоб не разрешало добавлять такие сообщения. Обычно это просто спам и флуд... например в последнее время зачастили что-то типа того "предлагаю поменяться ссылками ...и пошло поехало" такие сообщения вообще не нужны, а зарегистрированные пользователи обычно такой фигней не занимаются.
В php4 eregi() очень выручала, жаль что в php5 ее убрали.
С уважением, Марина
К сожалению этот код не работает :( Любые ссылки не замечает вообще. Сообщения с любыми ссылками добавляются.
Убрали внутренние скобки и варианты кода со слэшами: :// и /a - вот без них кажется работает. И кажется проблема была именно в этих слэшах (если правильно называю эти черточки, незнаю, обратные они или прямые, но думаю Вы меня поняли) ;-)
С уважением, Марина
А вот такое чудо что означает? ereg("[$d$q\n\r]") и на что его можно заменить?
Vit - судя по всему это чудо означает проверить если в тексте переносы строк и еще нечно, определенное в $d и $q - может быть все что угодно, нужно смотреть исходник. Заменить можно таким:
preg_match("/[$d$q\n\r]/")
Очень странно, что регулярное вырожение взято в [] если нужно проверить, что строки кончаются определенным окончанием то [] тут не нужны, [] означают любой символ из множества данных, но я сильно сомневаюсь, что в тексте множно поменять местами \n и \r (всегда забываю что идет в начале, но порядок важен).
Да, забыл совсем, что в двойные кавычки можно вставлять значения переменных. Полный текст выглядит так:
function fputcsv($f, $list, $d=",", $q='"') {
$line = "";
foreach ($list as $field) {
$field = str_replace("\r\n", "\n", $field);
if(ereg("[$d$q\n\r]", $field)) {
$field = $q.str_replace($q, $q.$q, $field).$q;
}
$line .= $field.$d;
}
$line = substr($line, 0, -1);
$line .= "\n";
return fputs($f, $line);
}
А, понятно, это для генерации csv файлов, тогда preg_match("/[$d$q\n\r]/") это определенно то что нужно.
И все равно!!!
Я не знаю как и чем думали создатели новых версий PHP но элементарный тест
$str="123ыва";
if(preg_match("/[a-z0-9]{1,}/",$str,$arr))
{echo"хорошо";}
else
{echo"плохо";}
Т.е. попытка проверить соответствие строки $str регулярному выражению [a-z0-9]{1,}
Результат:
хорошо
Array ( [0] => 123 )да нет ребята это все плохо это все ОЧЕНЬ! плохо оно его пропустило и мало того оно сделало выборку только цифр когда как ereg никогда бы себе такого НЕ ПОЗВОЛИЛ!!!!
И preg_match возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.
так чем заменить ereg?!
Исправьте версию PHP у Вас опечтка
исправил, но честно говоря пример мне не совсем понятен. В данном примере идет поиск строки состоящей из символов входящих в множество a-z0-9 - русские буквы туда никак не входят, хотите русских букв делайте так:
Да в том то и дело не хочу чтобы давая такую строку на проверку $str="123вава" ,а рег выражение [a-z0-9]{1,}...чтобы по if было true
чтобы строка которая содержит нежелательные символы срабатывала на else на ....плохо....
т.е. в данном случае строка с русскими буквами со знаками пунктуации и с заглавными латинскими, не должна срабатывать а она срабатывает должна печатать..... плохо..... а она печатает хорошо.
Вот еще подробнее, как заставить preg_match при шаблоне [a-z0-9]{1,} и проверки строки 123вава заставить выдать на выходе false чтобы в if не печатало ...хорошо...
Дело в том, что preg_match ищет в тексте те конструкции, которые удовлетворяют твоему регулярному выражению, но не наоборот, [a-z0-9]{1,} - в данном случае в строке 123вава будет найденно именно 123 потому что именно это ты и просил. Если хочешь отсечь нежелательные символы их и ищи - используй [^a-z0-9] тогда если preg_match их найдет, значит они есть. RTFM.
Ох уж этот вордпресс, в коде представленном выше вообще не нужны регулярные выражения, достаточно поска подстроки в строке, вот по идее что должно быть:
$browserAgent = $_SERVER ['HTTP_USER_AGENT'];
$userAgents = $this->getBrowserAgentsToDetect ();
foreach ( $userAgents as $userAgent ) {
if (strpos($browserAgent, $userAgent )!==false) {
if (strpos($browserAgent,"iphone")!==false || strpos($browserAgent,"ipod")!==false || strpos($browserAgent,"android")!==false) {
$this->smartPhone = true;
} else {
$this->pda = true;
}
}
}
p.s. в примере
хотя... может с подстрокой не сработать, нужно бы еще посмотреть что в getBrowserAgentsToDetect - если там список агентов в виде регулярных выражений, тогда, да, нужно тоже будет использовать preg_match.
Спасибо за помощь, обратился за помощю на форум, вопрос успешно решен http://bit.ly/Pj2p5W
Чудо вражеской техники заработало.
Добрый день!
Извените за тупость ,но не могу решить проблемму . Подскажите поалуйста.Есть код.
Warning: fsockopen() [function.fsockopen]: unable to connect to smtp.server.com:25 (Connection refused) in /var/www/dombtz12880/data/www/dombt.zp.ua/includes/classes/class.smtp.php on line 122
Warning: Cannot modify header information - headers already sent by (output started at /var/www/dombtz12880/data/www/dombt.zp.ua/includes/classes/class.phpmailer.php:592) in /var/www/dombtz12880/data/www/dombt.zp.ua/includes/functions/general.php on line 33
Warning: Cannot modify header information - headers already sent by (output started at /var/www/dombtz12880/data/www/dombt.zp.ua/includes/classes/class.smtp.php:122) in /var/www/dombtz12880/data/www/dombt.zp.ua/includes/functions/general.php on line 33
> Анатолий замените eregi('^(.+):([0-9]+)$', $hosts[$index], $hostinfo) на preg_matсh('/^(.+):([0-9]+)$/i', $hosts[$index], $hostinfo) и будет всё работать!
Анатолий, сорри не дочитал до конца - вторая ошибка связана с тем что не доступен smtp.server.com видимо нужно проверить конфиги и заменить smtp.server.com на реальный адрес smtp сервера. Эта ошибка никак не связана с регулярными выражениями.
Hi!
Помоги переписать код и ответ выложить на твой блог!
ОШИБКА preg_match(): Delimiter must not be alphanumeric or backslash
<li <?php if (eregi('finansi/pinkodi', url::current())) echo 'class="active"' ?>><span class="q03"><a href="/fin/pin" title="PIN">PIN</a></span></li>
переделаный мной
<li <?php if (preg_match('fin/pin', url::current())) echo 'class="active"' ?>><span class="q03"><a href="/finansi/pinkodi" title="PIN">PIN</a></span></li>
uriy > забыл ты разделители добавить в начало и конец! должно быть preg_match('#fin/pin#', url::current()) - так как / у тебя уже есть то вместь / я использовал # иначе нужно было бы писать \/
<li <?php if (preg_match('#fin/pin#i', url::current())) echo 'class="active"' ?>><span class="q03"><a href="/finansi/pinkodi" title="PIN">PIN</a></span></li>
Сплеш #i забыл?
В ощем спасибр заработало!
Но хочеца знать как запретить в штацесс новые функции пшп 5,5.заблокировать errors или отключить eregi.
был способ но я немогу его найти.
Подскажите пожалуйста, как исправить
if (!preg_match("/adm/", $_SERVER['REQUEST_URI']) && ($p_data['panel_display'] == 1 || eregi((SEO == "1" ? BRD_INDEX_FILE_HTML : BRD_INDEX_FILE_PHP)."$", FUSION_REQUEST.(FUSION_QUERY ? "?".FUSION_QUERY : ""))))
ругается на ереги:(
классный сайт, но к сожалению не все понимаю в програмировании
Юрий, попробуй вот так, трудно сказать что либо определенное не зная значений констант, но думаю должно сработать:
if (strpos($_SERVER['REQUEST_URI'],"adm")===false && ($p_data['panel_display'] == 1 || preg_match((SEO == "1" ? "#".BRD_INDEX_FILE_HTML."$#i": "#".BRD_INDEX_FILE_PHP."$#i"), FUSION_REQUEST.(FUSION_QUERY ? "?".FUSION_QUERY : ""))))
что-то не сработало:( контент перестал показываться даже
Юрий, попробуй замени !== на ===, по-моему, это более правильно
вроде сработало!!! спасибо огромное, ошибку не выает:)
Подскажите, плз, как исправить код?
Изначально -
if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
пробовал добавлять разделители - где-то ошибка
if(preg_match('/^([^=]*)["\/']?([^"\/']*)["\/']?$/',$v,$a3))
Вик, у меня получилась такая версия (у тебя лишние слеши в коде):
if(preg_match('/^([^=]*)=["\']?([^"\']*)["\']?$/',$v,$a3))
Скрипт пишет такую ошибку Deprecated: Function ereg_replace() is deprecated in Вот эта строка $args = explode('-', ereg_replace('([ ]+)', ' ', $command)); Как лучше заменить???
Добрый день.
Не могу правильно поменять:
...
$patt="($this->block_start_word|$this->block_end_word)[[:blank:]]*([0-9a-zA-Z\_]+)[[:blank:]]*$this->block_end_delim(.*)";
if (eregi($patt,$v,$res)) {...
...
помогите пожалуйста.
Заранее спасибо за быстрый ответ.
Алекс, видимо вот так: $args = explode('-', preg_replace('/([ ]+)/', ' ', $command));
Владислав, а что так не срабатывает?:
$patt="/($this->block_start_word|$this->block_end_word)[[:blank:]]*([0-9a-zA-Z\_]+)[[:blank:]]*$this->block_end_delim(.*)/i";
if (preg_match($patt,$v,$res)) {...
Не разбираюсь в програмировании помогите пожалуйста:
Ошибка:
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 60
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 64
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 68
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 72
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 75
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 78
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 81
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 84
Deprecated: Function eregi() is deprecated in /home/длинный путь/includes/init.php on line 87
Warning: Cannot modify header information - headers already sent by (output started at /home/длинный путь/includes/init.php :60) in /home/xxx/xx/xxxxxxx/xxxxxx/xxx/includes/global.php on line 65
Файл init.php :
if (!eregi("sell_item.php", $_SERVER['PHP_SELF']) || !eregi("sell_item.php", $_SERVER['PHP_SELF']) || $_REQUEST['option'] == "new_item" || eregi("sell_item.php", $_SERVER['PHP_SELF']) && $_REQUEST['option'] == "sell_similar") {
$session->unregister("auction_id");
$session->unregister("refresh_id");
}
if (!eregi("wanted_manage.php", $_SERVER['PHP_SELF']) && !eregi("category_selector.php", $_SERVER['PHP_SELF'])) {
$session->unregister("wanted_ad_id");
$session->unregister("wa_refresh_id");
}
if (!eregi("reverse_manage.php", $_SERVER['PHP_SELF']) && !eregi("category_selector.php", $_SERVER['PHP_SELF'])) {
$session->unregister("reverse_id");
$session->unregister("reverse_refresh_id");
}
if (eregi("edit_item.php", $_SERVER['PHP_SELF'])) {
$session->unregister("edit_refresh_id");
}
if (eregi("bid.php", $_SERVER['PHP_SELF'])) {
$session->unregister("bid_id");
}
if (eregi("reverse_bid.php", $_SERVER['PHP_SELF'])) {
$session->unregister("reverse_bid_id");
}
if (eregi("buy_out.php", $_SERVER['PHP_SELF'])) {
$session->unregister("buyout_id");
}
if (eregi("make_offer.php", $_SERVER['PHP_SELF'])) {
$session->unregister("make_offer_id");
}
if (eregi("swap_offer.php", $_SERVER['PHP_SELF'])) {
$session->unregister("swap_offer_id");
}
$start = abs(intval($_GET['start']));
?>
Подскажите, пожалуйста, а как быть с такой строкой
if (eregi('://', $url)) { $url = str_replace('://', '!@#', $url); }
Николай, попробуйте,
if (strpos($url,'://')!==false) { $url = str_replace('://', '!@#', $url); }
Ребят, пишет что здесь ошибка..
if (ereg (".gif$", "$file")){
Сам не шарю в PHP. Помогите нубу....
Отличный пост! Мне очень помогло
Спасибо!!
Помогите пожалуйста сам немогу сделать((
return (is_array($login)) ? false : (ereg("{$mask}{$len}$", $login)) ? $login : false;
и сдесь
return (is_array($password)) ? false : (ereg("{$mask}{$len}$", $password)) ? $password : false;
Установил движок 2z, на локалке все косяки которые вылезли я смог сам исправить, т.к. там было что исправлять. Но когда этот же движок установил на хостинг и вылезла точно такая же ошибка Deprecated: Function eregi() is deprecated in Те инструкции которые до этого мне помогали тут никак не подошли! В строке
global $lang, $member_db, $userROW, $config, $PHP_SELF;
нет никакого eregi() как видите! И как там править я даже понятия не имею! Подскажите пожалуйста, как быть в моём случае? Причём на локалке и на хостинге этот же файл и эта же строка - templates.class.php, строка 91 совершенно разные! Хотя по идее должны бы быть одинаковые!!
Всё, проблема решена. Установил сайт на локалке и уже установленный, как есть в папке переместил на хостинг, ошибка больше не появлялась. Странно всё равно - ведь установился то он нормально на хостинге! Ну ладно, по какой-то причине движок заглючил(или хостинг, или FTP клиент, или моё интернет соединение), но всё равно непонятно каким образом файлы templates.class.php с локалки и с хостинга оказались столь разными?? Чертовщина какая-то!
подскажите пожалуйста.. что тут не так,.. как правильно прописать, выходит ошибка
Warning: preg_match(): Delimiter must not be alphanumeric or backslash in /home/tralalala in line 431
if (preg_match('' . '\\/\\/' . $host, $referer))
помогите заменить
elseif (ereg("/[0-9a-z_]+@[0-9a-z_^\.]", "", $_POST[email])){
помогите выдаёт ошибку Deprecated: Function eregi() is deprecated in /home/u328329811/public_html/includes/init.php on line 60
if (!eregi("sell_item.php", $_SERVER['PHP_SELF']) || !eregi("sell_item.php", $_SERVER['PHP_SELF']) || $_REQUEST['option'] == "new_item" || eregi("sell_item.php", $_SERVER['PHP_SELF']) && $_REQUEST['option'] == "sell_similar") {
$session->unregister("auction_id");
$session->unregister("refresh_id");
Помогите пожалуйста сам немогу сделать((
return (is_array($login)) ? false : (ereg("{$mask}{$len}$", $login)) ? $login : false;
Помогите что тут не так