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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения WIN->NIX, В чём разница? 
V
    Опции темы
SamDark
Дата 20.11.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

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



Недавно написали с товарищем типограф на регулярных выражениях. Тестировался он на Windows (Denwer). При переносе на NIX-хост работать начал некорректно.

Чувствую, что дело в регулярных выражениях. Есть ли какие-либо особенности регулярок на WIN/NIX?


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
szz
Дата 20.11.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Нету.


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


Добрый кот
***


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

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



Тогда есть ли идеи, почему по разному работает код на win/nix:

Код

<?/*
    при создании типографа помимо личного опыта использовались:
      http://philigon.ru/
      http://artlebedev.ru/kovodstvo/
      http://pvt.livejournal.com/
*/

// типографит html
function typo($str)
{
    $safe_blocks = array(
        "<pre[^>]*>" => "<\/pre>",
        "<style[^>]*>" => "<\/style>",
        "<script[^>]*>" => "<\/script>",
        "<!--" => "-->",
    );

    $pattern = "((?U)";
    foreach ($safe_blocks as $start => $end) $pattern .= "$start.*$end|";
    $pattern .= "<[^>]*[\s][^>]*>)";
    $str = preg_replace_callback("/$pattern/is", '_typo_stack', $str);

    $str = typo_text($str);
    $str = strtr($str, _typo_stack());
    return $str;
}


function _typo_stack($m = false)
{    
    static $arr = array();
    if ($m !== false)
    {
        $key = "<tag".count($arr).">";
        $arr[$key] = $m[0];
        return $key;
    }
    else
    {
        $t = $arr;
        unset($arr);
        return $t;
    }
}


// типографит текст.
function typo_text($str){
    if (trim($str) == "") return "";
      
    // то, что предположительно захочется переопределять
    $sym = array(
        "nbsp"    => "&nbsp;",
        "lnowrap" => '<span style="white-space:nowrap">',
        "rnowrap" => "</span>",

        "lquote"  => "&laquo;",
        "rquote"  => "&raquo;",
        "lquote2" => "&lsquo;",
        "rquote2" => "&rsquo;",

        "mdash"   => "&mdash;",
        "ndash"   => "&ndash;",
        "minus"   => "&minus;",

        "hellip"  => "&hellip;",
        "copy"    => "&copy;",
        "trade"   => "&trade;",
        "apos"    => "'",   // см. http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos
        "reg"     => "&reg;",
    );


    $html_tag = "(?:(?U)<.*>)";
    $hellip = "\.{2,4}";
    
    $phrase_end   = "(?:[)!?.]|$|\w)";
    $phrase_begin = "(?:$hellip|\w)";
    $any_quote    = "(?:$sym[lquote]|$sym[rquote]|$sym[lquote2]|$sym[lquote2])";
    
    $replace = array(

         // кавычки        
        "/(?<=\s|^)($html_tag*)(\")($html_tag*$phrase_begin$html_tag*)/"    => '$1'.$sym['lquote'].'$3',
        "/($html_tag*$phrase_end$html_tag*)(\")($html_tag*$phrase_end$html_tag*|\s|[,:])/"    => '$1'.$sym['rquote'].'$3',

        // Знак дефиса или два знака дефиса подряд - на знак длинного тире.
        // + Нельзя разрывать строку перед тире, например: Знание - сила, Курить - здоровью вредить.
        "/(\s+|^)(--?)(?=\s)/" => '$1'.$sym["mdash"],

        // Знак дефиса, ограниченный с обоих сторон цифрами - на знак короткого тире.
        "/(?<=\d)-(?=\d)/" => $sym["ndash"],

        // Нельзя оставлять в конце строки однобуквенные предлоги и союзы а, в, и, к, о, с, у.
        "/(?<=\s|^|\W)(а|в|к|о|с|у|я|о|об|не|за|на|как|без|что)(\s+)/i" => '$1'.$sym["nbsp"],
        
        // Нельзя отрывать частицы бы, ли, же от предшествующего слова, например: как бы, вряд ли, так же.
        "/(?<=\S)(\s+)(ж|бы|же|ли|либо|или)(?=$html_tag*[\s)!?.])/i" => $sym["nbsp"].'$2',
        
        // неразрывный пробел после инициалов
        "/((\s\w\.){1,3})(\s)(\w)/" => '$1'.$sym["nbsp"].'$4',

        // закавыченное внутри закавыченного
        //"/($sym[lquote].*)($sym[lquote])(.*)($sym[rquote])(.*$sym[rquote])/Us" => '$1'.$sym["lquote2"].'$3'.$sym["rquote2"].'$5',

        //
        //"/($sym[lquote]\S*)(\s+)(\S*$sym[rquote])/U" => '$1'.$sym["nbsp"].'$3',


        // два-четыре знака точки подряд - на знак многоточия (больше - мб авторской задумкой)
        "/$hellip/" => $sym["hellip"],
                                
        "/\(c\)/i"    =>    $sym["copy"],
        "/\(r\)/i"    =>    $sym["reg"],
        "/\(tm\)/i"    =>    $sym["trade"],
        "/'/"        =>    $sym["apos"],

/*

 - Нельзя разрывать строку перед дефисом или после дефиса. (Если разорвать строку 
   после дефиса, читатель может принять его за знак переноса.) Например, нельзя
   переносить: как-нибудь, генерал-майор, большая-пребольшая.

 - Нельзя разрывать строку после тире, если оно разделяет границы диапазона, например: 1799-1837, 10-15 кг.

 - Нельзя разрывать сокращённые словосочетания, например: и т.д., т.е., у.е.

 - Нельзя отрывать инициалы друг от друга и от фамилии, например: А.С. Пушкин, Дж.Вашингтон.

 - Нельзя отрывать имя собственное от относящегося к нему сокращения, например: гр. Иванов, пос. Молоково.

 - Нельзя отрывать число от относящейся к нему единицы измерения, например: 60 м2, 25 %. Нельзя отрывать 
   знаки номера (№) и параграфа () от относящегося к ним числа, например: № 5,  38.

 - Нельзя разрывать многоразрядные числа, например: 98 765 432.

 - Нельзя оставлять в конце строки служебные части речи (предлоги, союзы, частицы) из 
   двух или трёх букв, если они стоят в начале предложения.

*/

    );

    $str = preg_replace(array_keys($replace), array_values($replace), $str);
//    return $m[1].$str.$m[3];
    return $str;
}


Это сообщение отредактировал(а) SamDark - 20.11.2006, 17:10


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
smartov
Дата 20.11.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

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



SamDark, одинаковы ли версии php?
PM MAIL   Вверх
szz
Дата 20.11.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Что там у нас в строке 69 произошло? 
  И почему именно на 69?  smile smile 

Это сообщение отредактировал(а) szz - 20.11.2006, 14:52


--------------------
PM   Вверх
SamDark
Дата 20.11.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

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



smartov
4.4.2 = localhost
4.3.10 = на сервере

Некорректно работает именно на сервере... Где у нас ченджлог PHP?

szz
Описка при копировании. Поправил код в посте.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
szz
Дата 21.11.2006, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Код

Где у нас ченджлог PHP?

http://www.php.net/ChangeLog-4.php
  Там стоко всего призошло...  копайся, мож найдешь.

Немного сомнительное место:
Код

        $t = $arr;
        unset($arr);
        return $t;


  Может в одном месте он как к копии относится, а в другом - как к ссылке? Т.е. unset посто удалит тот объект, на который ссылается $arr? И тогда плакала $t...
  Но так бы произошло в пятом, точно. А вот в таких минорных отличиях версий - хз...


--------------------
PM   Вверх
SamDark
Дата 21.11.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

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



C unset() всё в норме. Проверил его комментированием.

В ченджлоге про PCRE только http://bugs.php.net/bug.php?id=33200

Если у кого есть хоть какой-то php-сервер, прошу оттестить данную строчку:
Цитата
Кибер-панк в рубрике Возрождение: рассказы "Сердце", "Эвакуация" и "Майский жук".


Если выдаёт ёлочки - работает как надо, если оставляет обычные кавычки - что-то здесь не так...

p.s. может magic мешает?

---

Попробовали на 4.3.2, хочтинг - те же результаты smile
4.0, Денвер - работает...

Это сообщение отредактировал(а) SamDark - 21.11.2006, 10:37


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Mal Hack
Дата 21.11.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Единственно где может быть глюк - в регистре...
Хотя никогда с таким не встречался...
PM ICQ   Вверх
SamDark
Дата 21.11.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

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



Mal Hack
Подробнее, пожалуйста.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
-=Ustas=-
Дата 21.11.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

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



Скорее всего, по своему опыту именно с разнобоем в регах, проблема в locale. Нужно ставить нужную локаль для скрипта
Код

setlocale(LC_ALL, 'ru_RU.CP1251');

Если данная локаль на вашем серваке установлена, то должно помочь обязательно.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
SamDark
Дата 21.11.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


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

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



Всем огромное спасибо!
Про локаль даже и не думал... а зря smile


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
-=Ustas=-
Дата 21.11.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

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



Цитата(SamDark @  21.11.2006,  11:54 Найти цитируемый пост)
Про локаль даже и не думал... а зря

В регах просто используются всякие классы и спец-символы, которые в разных кодировках по-разному кодируются.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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