preg_replace()str_replace()撇号噩梦! - Drupal的菜单图像替换

问题描述:

任何人都可以帮我解码为什么这不起作用?preg_replace()str_replace()撇号噩梦! - Drupal的菜单图像替换

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

我已经创建了一个名为“什么@个菜单项新的“和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代码片段作者希望其他人也能从中受益。

+0

所以'$ link'包含'What's new',对吧?你确定它是一个'''(U + 0027),而不是像'\''(U + 0060),'''(U + 00B4),''(U + 2018),''' (U + 2019)还是'''(U + 201B)? – Gumbo 2009-09-10 11:55:24

+0

是的,我输入并重新输入它。我可能会进入数据库,看看字符编码是不是搞砸了。 – MrFidge 2009-09-10 12:00:14

+0

像Gumbo说的,你确定它是一个'...你应该测试你的功能,而不是与实时数据(很容易出错!),但首先自制数据;你知道哪些会起作用。如果可行,请在您的实时数据上触发它。看看会发生什么。 – Jake 2009-09-10 12:01:15

CSS图片替换是菜单项目更换一个更普遍选择的方式:

首先安装:Menu Attributes module能够assing CSS ID对每个菜单项。 (这些属性可以从管理面板上的菜单项编辑页面设置)

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

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

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

这是一个为置换的90×41px

图像和省略号替代:

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

你知道,我愿意Drupal.org会有这样的东西只是布局。它是最好的,但相反的WORST记录CMS的我用过:(谢谢你的提示,但看起来不错! – MrFidge 2009-09-11 09:11:51

+0

这很好用! – MrFidge 2009-09-11 09:54:44

+0

文档是一项艰苦的工作,drupal.org有太多的内容,因此很难记录所有内容,我也听说过关于Lullabot播客的一些关于文档问题的工作,我相信我们找不到解决我们的每一个问题,但新的Drupal搜索由Apache Solr和问题系统提供支持。(我也主要使用“谷歌搜索”与网站:drupal.org参数为我的Drupal查询:)) – 2009-09-11 14:48:07

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

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

主要是因为它不工作:)这是一直困扰我半个小时的地狱,并阻止我从完成我的工作:x – MrFidge 2009-09-10 11:28:31

+1

你先生是个天才。为什么我没有想到这一点。如果我有,我可能会来,并张贴...等一下。 – MrFidge 2009-09-10 11:49:14

转义单引号。

+0

仍然没有...我已经尝试过我可以想到的每个组合附近。这让我很生气! – MrFidge 2009-09-10 11:36:36

+0

$ cssid = str_replace('\'','',$ cssid); 应该肯定工作..除非你的php.ini有不同的东西吗? – Jake 2009-09-10 11:39:51

+0

仍然没有:(我完全准备相信这是PHP ini - 这是在FastHosts.com运行的IIS系统上开发的,它们很糟糕。主机搁置,任何其他想法? – MrFidge 2009-09-10 11:42:49

如果str_replace("'","")不工作,你确定要删除的人物的确是正常的单引号(“),而不是怪异的替代品(”),或一些奇怪的重音符号('`˙̛̉)或单引号('')还是什么?

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

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

或者很有可能,你是否意外地运行了一个不同于你正在编辑的代码副本 - 顺便说一句,当它发生时真的很烦人! :)

+0

哈哈耶对我来说也是如此 - 只要我能够看到它确实是一个普通的旧撇号而没有其他替代品,cssid也是一个完全可变的变量,所以它不会被取代这里。是的,这段代码已经正确地发布了:D – MrFidge 2009-09-10 12:02:34

+0

为了确保它是正确的字符,你可以尝试使用'file_put_contents('debug.txt',$ cssid)'并且将debug.txt中的字符复制到你的代码中,参见如果这样的话...... – 2009-09-10 12:08:50

+0

或者,ehm,更容易的检查是在替换之前强制执行'$ cssid =“What's new”',并检查它是否工作......(它会影响每个列表项,当然,但对于调试它并不重要。) – 2009-09-10 12:10:42

鉴于它是HTML,你认为它可能被表示为&#39而不是'?

+0

好主意!但是没有:( – MrFidge 2009-09-10 12:50:42