3

これが機能しない理由を解読するのを手伝ってくれる人はいますか?

$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">

"What@s New" というメニュー項目を作成しましたが、str_replace() はそれで問題なく動作するので、このアポストロフィがすべてです。私は同意すると思います、表現は機能しますが、それはエンコーディングの問題でなければなりません。これは実際には適切で一般的なアポストロフィであり、亜種の 1 つではありませんが、何らかの理由で 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 スニペットの作成者を紹介します。他の人も恩恵を受けることを願っています。

4

5 に答える 5

2

一重引用符をエスケープします。

于 2009-09-10T11:33:01.583 に答える
1

あなたのコードは問題ないようです。str_replaceしかし、固定文字列を置き換えるので使用しないのはなぜですか?

$cssid = str_replace("'", "", $cssid);
于 2009-09-10T11:25:32.943 に答える
1

うまくいかない場合str_replace("'","")は、削除したい文字が実際に変な代替文字 (') ではなく通常のアポストロフィ (') であるか、変なアクセント記号 (´`˙ ̛̉῾᾿) または一重引用符 ('') であるかどうかを確認してください。または何ですか?

それとも、$cssid他のバグによって の値が元に戻されるのでしょうか?

結果の間違った出力を見ているのではないでしょうか?

または、編集中のコードとは異なるコードのコピーを誤って実行してしまった可能性があります。:)

于 2009-09-10T11:52:44.970 に答える
1

それが HTML であることを考えると、'?

于 2009-09-10T12:04:15.957 に答える