0

在处理 Django 模板标签时,我发现自己需要获取一个字符串并将其转换为 CSS 标识符,以便它可以成为 html 元素的类属性的一部分。问题是字符串可以包含空格,这使得它无法用作 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'

我希望 + 将适用于(组),但显然它没有做我想要的。

4

3 回答 3

2

您可以slugify为此使用:

from django.template.defaultfilters import slugify
slugify("Something with a space in it")
于 2013-04-17T13:49:54.907 回答
1

您的正则表达式将匹配整个字符串,并且捕获的唯一组将是“它”(因此是结果)。捕获组将只保留它捕获的最后一个字符串。您无法使用一个正则表达式捕获任意数量的字符串。

但是,您可以做的是使用全局修饰符g(或者re.findall我相信只是在 Python 中)。就像是:

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

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

于 2013-04-17T13:50:01.893 回答
-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;
}

可以说,您不应该将任意数据硬塞到课程中,因为您可能会与现有课程发生冲突。数据属性允许您指定具有名称冲突的信息。

于 2013-04-17T13:42:47.907 回答