2009-09-10 40 views
3

任何人都可以幫我解碼爲什麼這不起作用?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

回答

2

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

1

你的代碼看起來不錯。但是你爲什麼不使用str_replace來代替固定字符串?

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

主要是因爲它不工作:)這是一直困擾我半個小時的地獄,並阻止我從完成我的工作:x – MrFidge 2009-09-10 11:28:31

+1

你先生是個天才。爲什麼我沒有想到這一點。如果我有,我可能會來,並張貼...等一下。 – MrFidge 2009-09-10 11:49:14

2

轉義單引號。

+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

1

如果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

1

鑑於它是HTML,你認爲它可能被表示爲&#39而不是'?

+0

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