Domanda

Qualcuno può aiutarmi a decodificare perché questo non funziona?

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

Cercando di eliminare le virgolette singole da alcuni HTML ...

Grazie! H

EDIT Questa è la funzione completa: è progettata per ricostruire il menu Drupal usando le immagini e applica le classi CSS a ciascun elemento, permettendoti di selezionare l'immagine desiderata. È necessario eliminare spazi e apostrofi o il selettore CSS non riesce.

Il titolo della voce di menu che causa tutto questo problema è:

What's new

Pensi piuttosto innocuo. (Ad eccezione di quel singolo ')

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

MODIFICA la saga continua ...

Ho notato il seguente errore in PHPMYADMIN:

  

L'estensione PHP mbstring non lo era   trovato e sembra che tu stia utilizzando a   set di caratteri multibyte. Senza il   phpMyAdmin è l'estensione mbstring   incapace di dividere correttamente le stringhe e   può provocare risultati imprevisti.

Mi chiedo se questo abbia qualcosa a che fare con esso?

In ogni caso il codice SQL è:

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

E questo viene visualizzato in FireBug una volta che è stato reso come:

<li id="What's_New">

Ho creato una voce di menu chiamata " What @ s New " e str_replace () funzionerà bene, quindi è TUTTO su questo dannato apostrofo. Penso di essere d'accordo, l'espressione funziona, ma deve essere un problema di codifica. È davvero un apostrofo vero, comune e non una delle varianti, ma per qualche ragione PHP non è assolutamente in grado di riconoscerlo come tale.

MODIFICA oh dio oh dio - è di nuovo Drupal ... Sembra che la funzione l () che formatta tutti i collegamenti sia completamente impermeabile alla sua riscrittura dell'output ?! In ogni caso, questo codice funziona ...

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 ore dopo e posso continuare a temare questo sito ...

Grazie mille per tutti i tuoi suggerimenti, indicherò gli autori di frammenti di drupal in questo post, quindi spero che anche altre persone ne trarranno beneficio.

È stato utile?

Soluzione

Sostituzione dell'immagine CSS è un modo molto più comunemente scelto per la sostituzione delle voci di menu:

Prima installazione: modulo Attributi menu per essere in grado di fornire gli ID CSS per ogni voce di menu. (questi attributi possono essere impostati dalla pagina di modifica delle voci di menu nel pannello di amministrazione)

Quindi utilizzare la sostituzione dell'immagine css. Qui è un buon tutorial per questo.

E questo è il metodo che uso per i miei siti:

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

Questo è un esempio per la sostituzione con un'immagine di 90 x 41px

E per la sostituzione dell'apostrofo:

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

Altri suggerimenti

sfugge alla singola citazione.

Il tuo codice sembra a posto. Ma perché non usi str_replace come & # 8217; stai sostituendo una stringa fissa?

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

Se str_replace (" '", " ") non funziona, sei sicuro che i caratteri che vuoi rimuovere siano effettivamente apostrofi normali (') invece di strane alternative ( & # 8217;) o alcuni strani accenti (& # 180; `& # 729; & # 777; & # 795; & # 8190; & # 8127;) o virgolette singole (& # 8216; & # 8217; ) o no?

O forse il valore di $ cssid viene sostituito all'originale da qualche altro bug?

Forse stai guardando l'output sbagliato per i risultati?

O, di gran lunga, stai accidentalmente eseguendo una copia del codice diversa da quella che stai modificando - a proposito, è davvero fastidioso quando succede! :)

Dato che si tratta di HTML, hai considerato che potrebbe essere rappresentato come & amp; # 39 anziché '?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top