preg_replace()str_replace()アポストロフィの悪夢! -Drupalメニュー画像の置き換え
-
05-07-2019 - |
質問
なぜこれが機能しないのかをデコードするのを手伝ってくれませんか?
$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はそのように認識できません。
EDIT OH god god-再び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 IDを確認できます。 (これらの属性は、管理パネルのメニュー項目編集ページから設定できます)
CSSイメージ置換を使用します。 こちらは、このための優れたチュートリアルです。
そして、これは私のサイトで使用している方法です:
#primary-tv
{
display: block;
width: 90px;
height: 0px;
padding-top: 41px;
background: url(images/nghtv.png);
}
これは、90 x 41pxの画像に置き換える例です
そしてアポストロフィの置換について:
$cssid = preg_replace("'","",htmlspecialchars($cssid, ENT_QUOTES));
他のヒント
一重引用符をエスケープします。
コードは正常に見えます。しかし、なぜ str_replace
をあなたとして使用しないでください&#8217;固定文字列を再置換しますか?
$cssid = str_replace("'", "", $cssid);
str_replace(&quot; '&quot;、&quot;&quot;)
が機能しない場合、削除したい文字が実際には奇妙な代替ではなく通常のアポストロフィ(')であることを確認してください&#8217;)、または奇妙なアクセント記号(&#180; `&#729;&#777;&#795;&#8190;&#8127;)または一重引用符(&#8216;&#8217; )または何ですか?
または $ cssid
の値が他のバグによって元の値に戻される可能性がありますか?
結果について間違った出力を見ているのでしょうか?
または偶然、編集中のコードとは異なるコードのコピーを誤って実行していませんか-ところで、それが起こると本当に迷惑です! :)
HTMLであることを考えて、 '?ではなく&amp;#39として表されるかもしれないと考えましたか?