2011-09-18 184 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