该\K转义序列重置匹配令牌列表中的当前位置的开始(这仅影响报告为全场比赛).
哪些环境/语言/版本\K在其正则表达式引擎中支持(保留)以及在模式中使用此功能需要哪些库(如果有)?
更新/注意事项:
(仔细读:)
我有一个包含可变数量的段(简化)的字符串:
$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
Run Code Online (Sandbox Code Playgroud)
我想现在匹配段并通过匹配数组返回它们:
$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
Run Code Online (Sandbox Code Playgroud)
这只会返回捕获组2 的最后一个匹配:DD.
有没有办法,我可以检索所有的子模式捕获(的方式AA,BB,DD)与一个正则表达式执行?不preg_match_all适合这个吗?
无论是$subject和$pattern简化.自然地与这样的通用列表AA,BB..是更容易与其它功能(例如,以提取explode),或与的的变化$pattern.
但我特别询问如何使用preg_...-family函数返回所有子组匹配.
对于现实生活中的情况,假设您有多个(嵌套)级别的子模式匹配变量.
这是用于描述一些背景的伪代码的示例.想象一下:
令牌的常规定义:
CHARS := [a-z]+
PUNCT := …Run Code Online (Sandbox Code Playgroud) 请考虑以下字符串:
I have been driving to {Palm.!.Beach:100} and it . was . great!!
Run Code Online (Sandbox Code Playgroud)
我使用以下正则表达式删除所有标点符号:
$string preg_replace('/[^a-zA-Z ]+/', '', $string);
Run Code Online (Sandbox Code Playgroud)
这输出:
I have been driving to PalmBeach and it was great!!
Run Code Online (Sandbox Code Playgroud)
但我需要正则表达式始终忽略{和}之间的任何内容.所以期望的输出将是:
I have been driving to {Palm.!.Beach:100} and it was great
Run Code Online (Sandbox Code Playgroud)
我怎样才能让正则表达式忽略{和}之间的内容?
我有一个flatfile数据库,它是由分隔符分隔的数据.
我允许人们在他们的输入中使用分隔符,但我确保\事先用它来逃避它.
问题是我的explode()函数仍然试图拆分转义的分隔符,所以如何告诉它忽略它们?
我有一个Web服务,它在css文件中重写URL,以便通过CDN提供服务.
css文件可以包含图像或字体的URL.
我目前有以下正则表达式匹配css文件中的所有URL:
(url\(\s*([\'\"]?+))((?!(https?\:|data\:|\.\.\/|\/))\S+)((\2)\s*\))
Run Code Online (Sandbox Code Playgroud)
但是,我现在想要引入对自定义字体的支持,并且需要在以下内容中定位网址@font-fontface:
@font-face {
font-family: 'FontAwesome';
src: url("fonts/fontawesome-webfont.eot?v=4.0.3");
src: url("fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"), url("fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"), url("fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"), url("fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");
font-weight: normal;
font-style: normal;
}
Run Code Online (Sandbox Code Playgroud)
然后我想出了以下内容:
@font-face\s*\{.*(url\(\s*([\'\"]?+))((?!(https?\:|data\:|\.\.\/|\/))\S+)((\2)\s*\))\s*\}
Run Code Online (Sandbox Code Playgroud)
问题是,这匹配所有内容,而不仅仅是内部的网址.我以为我可以这样使用lookbehind:
(?<=@font-face\s*\{.*)(url\(\s*([\'\"]?+))((?!(https?\:|data\:|\.\.\/|\/))\S+)((\2)\s*\))(?<=-\s*\})
Run Code Online (Sandbox Code Playgroud)
不幸的是,PCRE(PHP使用)不支持lookbehind中的变量重复,所以我被卡住了.
我不希望通过扩展名检查字体,因为某些字体的.svg扩展名可能与.svg扩展名的图像冲突.
另外,我还想修改我的原始正则表达式以匹配不在以下内容中的所有其他网址@font-face:
.someclass {
background: url('images/someimage.png') no-repeat;
}
Run Code Online (Sandbox Code Playgroud)
由于我无法使用lookbehinds,我如何从a中的@font-face那些和不在a中的那些中提取url @font-face?