preg_replace() str_replace() кошмарный апостроф!- Замена изображения меню Drupal

StackOverflow https://stackoverflow.com/questions/1404723

Вопрос

Кто-нибудь может помочь мне расшифровать, почему это не работает?

$cssid = preg_replace("/'/", "", $cssid);

Пытаюсь убрать одинарные кавычки из какого-нибудь html...

Спасибо!H

Редактировать Это полная функция - она предназначена для перестройки меню Drupal с использованием изображений и применяет классы CSS к каждому элементу, позволяя вам выбрать нужное изображение.Необходимо удалить пробелы и апострофы, иначе CSS-селектор выйдет из строя.

Заголовок пункта меню, вызывающего всю эту проблему, выглядит следующим образом:

What's new

Довольно безобидно, можно подумать.(За исключением этого сингла ')

function primary_links_add_icons() {
  $links = menu_primary_links();
  $level_tmp = explode('-', key($links));
  $level = $level_tmp[0];
  $output = "<ul class=\"links-$level\">\n";   
  if ($links) {
    foreach ($links as $link) {
        $link = l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment']);
        $cssid = str_replace(' ', '_', strip_tags($link));
        $cssid = str_replace('\'', '', $cssid);
        /*$link = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $link);*/
        $output .= '<li id="'.$cssid.'">' . $link .'</li>';
    };
    $output .= '</ul>';
  }
  return $output;
}

РЕДАКТИРОВАТЬ сага продолжается...

Я замечаю, что в PHPMYADMIN я получаю следующую ошибку:

Расширение mbstring PHP не было найдено и вы, похоже, используете многобайтовую кодировку.Без расширения mbstring phpMyAdmin не может корректно разделять строки и это может привести к неожиданным результатам.

Интересно, имеет ли это к этому какое-то отношение?

В любом случае SQL-код является:

('primary-links', 951, 0, 'http://www.google.com', '', 'What''s New',

И это отображается в FireBug, как только оно было отрисовано в виде:

<li id="What's_New">

Я создал пункт меню под названием "Что @нового", и str_replace() будет работать с этим просто отлично, так что ВСЕ дело в этом чертовом апострофе.Думаю, я согласен, выражение работает, но это, должно быть, проблема с кодировкой.Это действительно правильный, распространенный апостроф, а не один из вариантов, но по какой-то причине PHP абсолютно неспособен распознать его как таковой.

РЕДАКТИРОВАТЬ о боже, о боже - это снова Drupal...Похоже, что функция l(), которая форматирует все ссылки, полностью невосприимчива к перезаписи ее выходных данных ?!В любом случае, этот код работает...

function primary_links_add_icons() {
  $links = menu_primary_links();
  $level_tmp = explode('-', key($links));
  $level = $level_tmp[0];
  $output = "<ul class=\"links-$level\">\n";   
  if ($links) {
    foreach ($links as $link) {
        $link['title'] = str_replace('\'', '', $link['title']);
        $link = l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment']);
        $cssid = str_replace(' ', '_', strip_tags($link));      
        /*$link = preg_replace('#(<a.*?>).*?(</a>)#', '$1$2', $link);*/
        $output .= '<li id="'.$cssid.'">' . $link .'</li>';
    };
    $output .= '</ul>';
  }
  return $output;
}

2 часа спустя, и я смогу продолжить тематизацию этого сайта...

Большое вам спасибо за все ваши предложения, я собираюсь указать авторам фрагмента drupal на этот пост, так что, надеюсь, другим людям это тоже пойдет на пользу.

Это было полезно?

Решение

Замена изображения CSS это гораздо более часто выбираемый способ замены пункта меню:

Первая установка: Модуль Атрибутов меню чтобы иметь возможность определять css-идентификаторы для каждого пункта меню.(эти атрибуты можно задать на странице редактирования пункта меню в панели администратора)

Затем используйте замену изображения css. Здесь это хороший учебник для этого.

И это тот метод, который я использую для своих сайтов:

    #primary-tv
{
    display: block;
    width: 90px;
    height: 0px;
    padding-top: 41px;
    background: url(images/nghtv.png);
}

Это пример для замены изображением размером 90 x 41 пикселей

И для замены апострофа:

$cssid = preg_replace("&#039;","",htmlspecialchars($cssid, ENT_QUOTES));

Другие советы

экранируйте одинарную кавычку.

Ваш код выглядит нормально.Но почему бы вам не использовать str_replace как вы заменяете фиксированную строку?

$cssid = str_replace("'", "", $cssid);

Если str_replace("'","") не работает, вы уверены, что символы, которые вы хотите удалить, действительно являются обычными апостроф (') вместо странных альтернатив (’), или какими-то странными знаками ударения (` ), или одинарными кавычками (‘), или еще чем-то?

Или, может быть, ценность $cssid заменяется обратно на оригинал какой-то другой ошибкой?

Может быть, вы смотрите на неправильные выходные данные для получения результатов?

Или, по крайней мере, вы случайно запускаете другую копию кода, отличную от той, которую вы редактируете - кстати, это действительно раздражает, когда это происходит!:)

Учитывая, что это HTML, рассматривали ли вы, что он может быть представлен как 'а не '?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top