Pergunta

Alguém pode me ajudar a decodificar por que isso não funciona?

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

Tentando retirar as marcas de citação única de alguns HTML ...

Obrigado! H

Editar esta é a função completa - ele foi projetado para reconstruir o menu Drupal usando imagens e aplica classes CSS a cada item, permitindo selecionar a imagem desejada. A remoção de espaços e apóstrofos precisa ser feita ou o seletor CSS falha.

O título do item de menu causando todo esse problema é:

What's new

Muito inócuo, você pensaria. (Exceto para aquele single ')

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;
}

Editar a saga continua ...

Percebo que recebo o seguinte erro em phpmyadmin:

A extensão do MBSTRING PHP não foi encontrada e você parece estar usando um charset multibyte. Sem a extensão do mbstring, a phpmyadmin não consegue dividir as cordas corretamente e pode resultar em resultados inesperados.

Eu me pergunto se isso tem algo a ver com isso?

De qualquer forma, o código SQL é:

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

E isso é exibido no Firebug, uma vez que foi renderizado como:

<li id="What's_New">

Eu criei um item de menu chamado "What@s New" e o str_replace () funcionará bem, então é tudo sobre esse apóstrofo de Deus. Acho que concordo, a expressão funciona, mas deve ser um problema de codificação. É realmente um apóstrofo adequado, comum e não uma das variantes, mas por algum motivo o PHP é absolutamente incapaz de reconhecê -lo como tal.

Editar Oh Deus Oh Deus - é Drupal de novo ... parece que a função l () que formata todos os links é completamente impermeável a ter sua produção reescrita?! Seja qual for o caso, este código funciona ...

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 horas depois e eu posso continuar com eles este site ...

Muito obrigado por todas as suas sugestões, vou apontar os autores do Drupal Snippet neste post, então espero que outras pessoas se beneficiem com ele também.

Foi útil?

Solução

Substituição de imagem CSS é uma maneira muito mais escolhida para o item de menu substituindo:

Primeira instalação: Módulo de atributos de menu Ser capaz de assinar IDs CSS para cada item de menu. (Esses atributos podem ser definidos na página de edição do item de menu no painel de administrador)

Em seguida, use a substituição da imagem CSS. Aqui é um bom tutorial para isso.

E este é o método que eu uso para meus sites:

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

Este é um exemplo para substituição por uma imagem de 90 x 41px

E para a substituição de apóstrofe:

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

Outras dicas

escape da única citação.

Seu código parece bem. Mas por que você não usa str_replace Como você está substituindo uma string fixa?

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

Se str_replace("'","") Não funciona, tem certeza de que os personagens que você deseja remover são realmente apóstrofos normais (') em vez de alternativas estranhas ('), ou algumas marcas de sotaques estranhas (`` ̛̉῾᾿) ou citações únicas ('') ou Não?

Ou talvez o valor de $cssid é substituído de volta ao original por outro bug?

Talvez você esteja olhando para a saída errada para obter resultados?

Ou por uma chance de longe, você está acidentalmente executando uma cópia diferente do código daquele que está editando - btw, isso é realmente irritante quando isso acontece! :)

Dado que é html, você considerou que pode ser representado como 'em vez de'?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top