2011-09-18 181 views
1

我試圖在PHP中創建一個函數,它將通過CSS和JS文件並在CSS選擇器中替換類名稱和ID(但不是直接指定HTML元素或CSS屬性)破壞其他內容。然而,在世界上所有愚蠢的運氣中,當談到正則表達式時,我毫無希望。CSS類名稱的正則表達式

我有兩個數組,一個是「原始」字,一個是我想要將它轉換爲字的數組。

$array1 = array("ul", "text", "border"); 
$array2 = array("bar", "foo", "far"); 

$str = magic($str, $array1, $array2); 

而這個神奇的功能將在下面的CSS文件

#test-text ul { 
    text-decoration: none; 
} 
.ul-border span { 
    border: 1px solid #fff; 
} 
#text.niceborder { 
    border-color: #ccc; 
} 

變成

#test-foo ul { 
    text-decoration: none; 
} 
.bar-far span { 
    border: 1px solid #fff; 
} 
#foo.nicefar { 
    border-color: #ccc; 
} 

我希望同樣的功能,可以用來做同樣的事情jQuery選擇在JS中,但如果我得到的基本邏輯後面找到適當的選擇器和應用數組僅用於。和#段,我想我可以讓我自己一個$()適應;)

太感謝您了

+0

這個CSS必須是巨大的,因爲它比編寫一個工具更容易,而不僅僅是逐個替換類。 – GolezTrol

+0

你的意思是我應該手動替換類名稱? $ array2的內容取決於用戶輸入,所以我需要隨時更改類名稱。 –

+0

這個陣列中有多少物品?可以多次運行preg_replace嗎? – enyo

回答

4

我不知道爲什麼你需要它,但我認爲這是你想要的功能:

<?php 

/** 
* Replaces all occurences in a CSS class or ID name with the provided replacement. 
* 
* @param string $subject 
* @param array $search 
* @param array $replace 
* @return string 
*/ 
function replaceNames($subject, $search, $replace) 
{ 
    // First generate all search regular expressions 
    $searchRegexpressions = array_map(function($s) 
    { 
     return '/([\#\.][a-z0-9\-_]*)(' . preg_quote($s) . ')/i'; 
    }, $search); 
    // Now all associated replacement expressions 
    $replaceRegexpressions = array_map(function($r) 
    { 
     return '$1' . $r; 
    }, $replace); 

    do { 
     // Now do the replacements as often as necessary to replace every occurence. 
     $subject = preg_replace($searchRegexpressions, $replaceRegexpressions, $subject, -1, $count); 
    } while ($count > 0); 

    return $subject; 
} 
?> 

要解釋的正則表達式:

/([\#\.][a-z0-9\-_]*)(' . preg_quote($s) . ')/i 
  1. 它必須以#或者#開頭。
  2. 字母,數字或 - _可以按照他們想要的次數(*)進行。 (如果你有更好的類名,你可能需要添加字符。)
  3. 有問題的字符串。

另外:我使用了匿名函數。如果您不使用PHP 5.3.0+,則必須實際創建兩個映射函數,然後使用:array_map(mySearchRegexFuncion, $search);

+0

太棒了!像我想要的魔法一樣工作,非常感謝你! :) –

+0

我開始將項目添加到數組中,並且一切都順利進行,直到我點擊數組中的第61個值,此時該函數開始輸出空白(值1-60仍然可以正常轉換)。這是代碼或我的配置問題嗎?我不得不單獨移動這些函數,因爲我運行的是PHP 5.2.8 –

+0

Mh ..可能PHP有字符串大小的問題。你從文件中獲取字符串嗎?在這種情況下,你可以做到線/線。 – enyo

0

我努力尋找一個理由你正在嘗試做將永遠是一個好主意。如果您只想根據某些設置或基於PHP的邏輯更改一堆樣式,只需使用PHP生成一個類名稱,然後就可以使用它來生成覆蓋CSS規則。

像這樣:

<?php 
    $a = "my-a-style"; 
    $b = "my-b-style"; 
    $parentClass = someLogicalFunction() ? $a : $b; 
?> 
<div class="<?php echo $parentClass; ?>"> 
    <div id="test"> 
    <ul> 
     <li><span>Some Stuff</span></li> 
    </ul> 
    </div> 
</div> 

現在你可以創建單獨的CSS規則:

.my-a-style #test {} 
.my-b-style #test {} 
+0

這對我最初的問題來說是一個很好的解決方案。不過,我也期待使用相同的代碼來出於性能原因混淆和縮短我的類名稱。所以.main-general-float-wrapper-spacer變爲.m-g -f-w -s –

+0

@Emphram:你爲什麼沒有這麼長的類名? '.main-general-float-wrapper-spacer'很荒謬。你意識到你可以在一個元素上有多個類,對嗎? – Eric

+0

你可以,但不是,如果你想支持IE6。 – enyo