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

正規表現は文字列全体に一致し、キャッチされる唯一のグループは「it」になります(したがって結果)。キャプチャ グループは、最後にキャプチャした文字列のみを保持します。1 つの正規表現で任意の数の文字列をキャッチすることはできません。

ただし、できることは、グローバル修飾子を使用することですg(または、単にre.findallPython で私が信じている)。何かのようなもの:

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 に答える