我正在编写一个手工编写的CSS 2.1解析引擎(在C#中),我正在直接使用W3C CSS 2.1语法(http://www.w3.org/TR/CSS21/grammar.html)。但是,有一个令我不太了解的标记:
url ([!#$%&*-~]|{nonascii}|{escape})*
...
"url("{w}{url}{w}")" {return URI;}
"url("{w}{string}{w}")" {return URI;}
我不知道URL生产应该做什么。它似乎只是一串!#$%&*-~
,非ascii或转义的unicode代码点。这是一个URL怎么样?这个产品的命名真的很糟糕吗,它应该服务的目的是什么?
任何帮助表示赞赏。 仅供参考,我添加了C#标签只是为了增加可能遇到过这种情况或有见解的实际程序员的观众 - 如果您认为我不应该申请,我会道歉。
答案 0 :(得分:2)
伙计,您是否阅读了围绕该表达的背景?
baduri1 url\({w}([!#$%&*-\[\]-~]|{nonascii}|{escape})*{w}
baduri2 url\({w}{string}{w}
baduri3 url\({w}{badstring}
嗯......坏,坏,坏。有点赠品,呃什么?一般来说,如果doco中的某些东西对你没有意义,或者看起来是完全错误的,那么它可能没有意义吗?是?所以你读一下它......以获得正确的背景。
答案 1 :(得分:2)
[!#$%&*-~]
分解为:
!
,#
,$
,%
,&
,以及字符范围*
- ~
。< / p>
这会占用大多数可打印的ASCII字符,包括大写,小写,数字和一系列标点字符。
列出此正则表达式不匹配的可打印ASCII字符更容易:
双引号"
,单引号'
和括号(
,)
;即可打印的ascii字符减去分隔符。这使得可以解析不包含引号的URL。例如。 url(http://example.com)
代替url("http://example.com")
。
简洁,但很棘手!
P.S。令牌名称也令人困惑。更好的名称可能是:url_string
或url_arg
。
2015年2月编辑最新CSS3 Syntax Spec名称为url-unquoted
答案 2 :(得分:1)
我不知道URL生产应该做什么。它似乎只是一串!#$%&amp; * - 〜,非ascii或转义的unicode代码点。那个URL怎么样?这个产品的命名真的很糟糕吗,它应该服务的目的是什么?
第一行将url
定义为正则表达式:
url ([!#$%&*-~]|{nonascii}|{escape})*
第二行将URI
定义为可以由词法分析器生成/返回的标记:
"url("{w}{url}{w}")" {return URI;}
第二行表示如果词法分析器看到url(
然后{w}
然后{url}
然后{w}
然后)
,则会找到一个URI。
{w}
表达式是可选的空格。
因此根据定义,{url}
是一个正则表达式:它定义了URI
标记内允许的字符,在最初的url(
和最终的{{1}之间}。