如何使用python从任意字符串创建CSS标识符?

时间:2013-04-17 13:38:45

标签: python regex django

使用Django Template标签,我发现自己需要取一个字符串并将其转换为CSS标识符,因此它可以成为html元素的class属性的一部分。问题是字符串可以包含空格,这使得它作为CSS标识符无用,并且它也可能包含标点符号。

我的想法是使用正则表达式来撕掉好的部分,然后将它们重新组合在一起,但我无法弄清楚如何表达重复的组模式。这就是我所拥有的

to_css = re.compile(r"[^a-z_-]*([a-z0-9_-]+[^a-z0-9_]*)+", re.IGNORECASE)
@register.filter(name='as_css_class')
def as_css_class(value):
    matches = to_css.match(value)
    if matches:
        return '-'.join(matches.groups())
    return ""

问题来自于你这样做:

as_css_class("Something with a space in it")

你得到了

'it'

我希望+会适用于(群组),但显然它不会做我想要的。

3 个答案:

答案 0 :(得分:2)

您可以使用slugify

from django.template.defaultfilters import slugify
slugify("Something with a space in it")

答案 1 :(得分:1)

你的正则表达式将匹配整个字符串,唯一捕获的组将是“它”(因此结果)。捕获组将仅保留捕获的最后一个字符串。你不能用一个正则表达式捕获任意数量的字符串。

然而,您可以使用全局修饰符g(或简称为re.findall我相信)。类似的东西:

re.findall(r'[\w-]+');

然后加入结果(或多或少,我的Python有点生锈)。

答案 2 :(得分:-1)

是否需要成为CSS类?

<div data-something="Anything you like provided it's HTML escaped"> ... </div>
div[data-something="Anything you like provided it's HTML escaped"] {
    background: red;
}

可以说你不应该把任意数据带入课堂,因为你冒着与现有课程发生冲突的风险。数据属性允许您指定名称冲突的信息。