相关疑难解决方法(0)

在正则表达式中支持\ K.

\K转义序列重置匹配令牌列表中的当前位置的开始(这仅影响报告为全场比赛).

哪些环境/语言/版本\K在其正则表达式引擎中支持(保留)以及在模式中使用此功能需要哪些库(如果有)?

regex

47
推荐指数
1
解决办法
1万
查看次数

如何使用preg_match_all()获取子组匹配的所有捕获?

更新/注意事项:

我认为我可能正在寻找的是用PHP 获取组捕获.

引用:使用命名模式子例程的PCRE正则表达式.

(仔细读:)


我有一个包含可变数量的段(简化)的字符串:

$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)

php regex grammar preg-match-all

19
推荐指数
1
解决办法
1万
查看次数

如何让正则表达式忽略括号之间的所有内容?

请考虑以下字符串:

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)

我怎样才能让正则表达式忽略{和}之间的内容?

php regex

11
推荐指数
1
解决办法
1万
查看次数

PHP:爆炸但忽略转义分隔符

我有一个flatfile数据库,它是由分隔符分隔的数据.

我允许人们在他们的输入中使用分隔符,但我确保\事先用它来逃避它.

问题是我的explode()函数仍然试图拆分转义的分隔符,所以如何告诉它忽略它们?

php

6
推荐指数
1
解决办法
5921
查看次数

通过在@ font-face中搜索替换,从@ font-face中提取网址

我有一个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

css php regex

3
推荐指数
1
解决办法
767
查看次数

标签 统计

php ×4

regex ×4

css ×1

grammar ×1

preg-match-all ×1