【问题标题】:preg_replace() str_replace() apostrophe nightmare! - Drupal menu image replacepreg_replace() str_replace() 撇号噩梦! - Drupal 菜单图像替换
【发布时间】:2009-09-10 11:23:39
【问题描述】:

谁能帮我解读一下为什么这不起作用?

$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() 可以很好地处理它,所以这完全是关于这个该死的撇号。我想我同意,表达有效,但它必须是一个编码问题。它确实是一个适当的、常见的撇号,而不是变体之一,但由于某种原因 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 sn-p 作者,希望其他人也能从中受益。

【问题讨论】:

  • 所以$link 包含What's new,对吗?你确定它是' (U+0027) 而不是类似` (U+0060), ´ (U+00B4), (U+2018), ( U+2019) 或 (U+201B)?
  • 是的,我已经输入并重新输入了它。我可能会进入数据库,看看字符编码是否以某种方式搞砸了。
  • 就像 Gumbo 说的那样,你确定它是一个 ' ...你应该测试你的函数,而不是使用实时数据(非常容易出错!),而是首先使用自制数据;你知道这会起作用。如果可行,请在您的实时数据上启动它。看看会发生什么。
  • 该代码对我有用...$cssid 得到一个值 Whats_new
  • 我打赌某种编码问题。这个字符将不是撇号——啊,每次我使用它时,我都必须使用剪切和粘贴来使这个词正确! :)

标签: php drupal drupal-6 preg-replace


【解决方案1】:

CSS 图像替换 是一种更常用的菜单项替换方式:

首次安装:Menu Attributes module 能够为每个菜单项分配 css id。 (这些属性可以在管理面板的菜单项编辑页面中设置)

然后使用 css 图片替换。 Here 是一个很好的教程。

这是我用于我的网站的方法:

    #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));

【讨论】:

  • 你知道,我希望 Drupal.org 会有这样的东西。它是我用过的最好的,但相反的记录最差的 CMS 之一 :( 谢谢你的提示,看起来很棒!
  • 文档是一项艰苦的工作,而 drupal.org 的内容太多,因此很难记录所有内容。我还在 Lullabot 播客上听到了一些关于文档问题的工作。我确信我们无法找到解决所有问题的方法,但是由 Apache Solr 和问题系统提供支持的新 Drupal 搜索可以提供帮助。 (我也主要使用带有 site:drupal.org 参数的“谷歌搜索”来进行我的 drupal 查询:))
  • 是的,我知道你的意思。但肯定有一篇“安装这些模块以制作一个不错的 CMS”的文章:P
【解决方案2】:

转义单引号。

【讨论】:

  • 仍然没有......我已经尝试了几乎所有我能想到的组合。这让我发疯了!
  • $cssid = str_replace('\'', '', $cssid);肯定可以工作.. 除非你的 php.ini 有什么不同?
  • 仍然没有 :( 我完全准备好相信它是 PHP ini - 这是在 FastHosts.com 运行的 IIS 系统上开发的,它们太糟糕了。除了托管,任何其他想法?
  • 我刚刚确认它仅在使用单引号时有效。
  • 我用过这段代码; $string = ""; $string = str_replace('\'',"-",$string);
【解决方案3】:

您的代码看起来不错。但是为什么不使用str_replace 来替换固定字符串呢?

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

【讨论】:

  • 主要是因为那也不管用 :) 半小时以来,它一直困扰着我,让我无法完成工作:x
  • 您先生是个天才。我怎么没想到。如果我有,我可能会来发帖...哦等等。
【解决方案4】:

如果str_replace("'","") 不起作用,您确定要删除的字符确实是正常的撇号 (') 而不是奇怪的替代字符 ('),还是一些奇怪的重音符号 (´`˙ ̛̉῾᾿) 或单引号 ('') 之类的?

或者$cssid 的值可能被其他错误替换回原来的值?

也许您正在查看错误的结果输出?

或者很可能,您是否不小心运行了与您正在编辑的代码不同的代码副本 - 顺便说一句,当它发生时真的很烦人! :)

【讨论】:

  • 哈哈是的,这也发生在我身上——据我所知,它确实是一个普通的旧撇号,没有其他选择。 cssid 也是一个完全组成的变量,所以它不会在任何地方被替换。是的,这段代码正在正确发布:D
  • 为确保它是正确的字符,您可以尝试file_put_contents('debug.txt',$cssid) 并将 debug.txt 中的字符复制到您的代码中,看看是否有效...
  • 或者,嗯,更简单的检查是在替换之前强制$cssid = "What's new",并检查它是否有效......(它当然会影响每个列表项,但为了调试它应该没关系。)
【解决方案5】:

鉴于它是 HTML,您是否认为它可以表示为 ' 而不是 '?

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多