ФорумПрограммированиеPHP для идиотов → Снова регулярка, а может и не в ней дело

Снова регулярка, а может и не в ней дело

  • developer

    Сообщения: 241 Репутация: N Группа: Кто попало

    Spritz 22 ноября 2010 г. 4:40

    Снова заёбуюсь с регуляркой, а может даже дело не совсем в ней:

    while ($specs_array = tep_db_fetch_array ($specs_query) ) {
    // Retrieve the GET vars used as filters
    // Variable names are the letter "f" followed by the specifications_id for that spec.
    $var = 'f' . $specs_array['specifications_id'];
    $$var = '0';

    if (isset ($_GET[$var]) && $_GET[$var] != '') {
    // Decode the URL-encoded names, including arrays
    // $$var = tep_decode_recursive ($_GET[$var]);
    $$var = $_GET[$var];
    // $$var = tep_clean_get__recursive ($$var);
    // Sanitize variables to prevent hacking
    $$var = preg_replace("|([^0-9a-zA-Zа-яА-Я])|","", $$var);

    // Get rid of extra values if Select All is selected
    $$var = tep_select_all_override ($$var);



    пробовал
    $$var = iconv('KOI8-R', 'windows-1251', $$var);

    потому что detect_cyr_charset выдавал k, но после того как iconv поставил начало выдавать m (кодировку), а это уже MAC, ничего не пойму

    PS Это модуль спецификаций для OSCommerce, с англ. работает, так же работает цифры+англ ( пример http://edem.pl.ua/products_filter.php?cPath=28&sort=products_name&f6=45x45 ), а вот с русскими словами не хочет ( пример http://edem.pl.ua/products_filter.php?cPath=29&sort=products_sort_order&f10=%C3%81%C3%A0%C3%AC%C3%A1%C3%B3%C3%AA ), так же не хочет работать если между ключами пробел (тоесть два слова в спецификации). на офф сайте vam'a (версия oscommerce) разработчики тоже крестятся от системы, страница офф модуля поддерживает только англ версию, зоебался тыкать.

    PPS Кстати если 20 раз делать вышеприведенный iconv то можно получить исходный текст )) (for)
  • developer

    Сообщения: 241 Репутация: N Группа: Кто попало

    Spritz 22 ноября 2010 г. 5:42, спустя 1 час 2 минуты 8 секунд

    все разобрался, как тему закрывать?
  • md5

    Сообщения: 11954 Репутация: N Группа: в ухо

    Spritz 22 ноября 2010 г. 5:58, спустя 15 минут 23 секунды

    не надо закрывать, напиши как проблему решил и все
    все умрут, а я изумруд
  • developer

    Сообщения: 241 Репутация: N Группа: Кто попало

    Spritz 22 ноября 2010 г. 6:48, спустя 50 минут 44 секунды

    Все дело в использовании модуля SEO, с чпу ссылками, он заменяет стандартный tep_href_link на свой. Я решил проблему в одном из магазинов ( пример можете посмотреть на http://edem.pl.ua/Odejala-c-29.html ) таким образом:

    1) Создал новую функцию в файле html_output.php

    function tep_href_spec($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
    global $request_type, $session_started, $SID;

    if (!tep_not_null($page)) {
    die('<br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine the page link!<br><br>');
    }

    if ($connection == 'NONSSL') {
    $link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
    } elseif ($connection == 'SSL') {
    if (ENABLE_SSL == true) {
    $link = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG;
    } else {
    $link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
    }
    } else {
    die('<br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine connection method on a link!<br><br>Known methods: NONSSL SSL</b><br><br>');
    }

    if (tep_not_null($parameters)) {
    $link .= $page . '?' . tep_output_string($parameters);
    $separator = '&';
    } else {
    $link .= $page;
    $separator = '?';
    }

    while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);

    // Add the session ID when moving from different HTTP and HTTPS servers, or when SID is defined
    if ( ($add_session_id == true) && ($session_started == true) && (SESSION_FORCE_COOKIE_USE == 'False') ) {
    if (tep_not_null($SID)) {
    $_sid = $SID;
    } elseif ( ( ($request_type == 'NONSSL') && ($connection == 'SSL') && (ENABLE_SSL == true) ) || ( ($request_type == 'SSL') && ($connection == 'NONSSL') ) ) {
    if (HTTP_COOKIE_DOMAIN != HTTPS_COOKIE_DOMAIN) {
    $_sid = tep_session_name() . '=' . tep_session_id();
    }
    }
    }

    if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
    while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);

    $link = str_replace('?', '/', $link);
    $link = str_replace('&', '/', $link);
    $link = str_replace('=', '/', $link);

    $separator = '?';
    }

    if (isset($_sid)) {
    $link .= $separator . $_sid;
    }

    return $link;
    }


    Она полный клон стандартной tep_href_link

    2) в той же папке функций есть файл products_specifications.php

    заменил

    $field .= '<a href="' . tep_href_link ($target, tep_get_array_get_params (array ( $name, 'page') ) . ($link_data['id'] == '0' ? '' : $name . '=' . tep_output_string($link_data['id']))) . '">';

    на

    $field .= '<a href="' . tep_href_spec ($target, tep_get_array_get_params (array ( $name, 'page') ) . ($link_data['id'] == '0' ? '' : $name . '=' . tep_output_string($link_data['id']))) . '">';

    и все заработало (русские спецификации я имею ввиду)

    Со спецсимволами я не пробовал, но из двух слов не хочет работать, тут вижу именно проблему в регулярке, как добавить помимо букв и цифр туда тире и пробел? можно и точку думаю, запятую, точкузапятую …. наглости нет предела.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 22 ноября 2010 г. 11:10, спустя 4 часа 21 минуту 28 секунд

    developer, красавец!
    Сапожник без сапог
  • Mars

    Сообщения: 304 Репутация: N Группа: Кто попало

    Spritz 22 ноября 2010 г. 13:45, спустя 2 часа 35 минут 5 секунд

    "|([^0-9a-zA-Zа-яА-Я])|"


    '/[^0-9a-zA-Zа-яА-Я]/'
    Спустя 60 сек.
    >как добавить помимо букв и цифр туда тире и пробел

    '/[^0-9a-zA-Zа-яА-Я\-\040]/'
    Спустя 160 сек.
    > можно и точку думаю, запятую, точкузапятую

    '/[^0-9a-zA-Zа-яА-Я\-\040\.\,\;]/'

Пожалуйста, авторизуйтесь, чтобы написать комментарий!