- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我无法从字符串中获取“今天”值。该模式是获取放置在双花括号内的字符串和放置在双花括号外的字符串。
我只得到“内部”值。模式是:
/({{(?P<inside>[^}{]+)}}|}}(?P<outside>[^}{]+){{)/
字符串是
{{Friday}}today{{Sunday}}
PHP代码是:
$returnValue = preg_match_all('/({{(?P<inside>[^}{]+)}}|}}(?P<outside>[^}{]+){{)/', '{{Friday}}today{{Sunday}}', $matches);
这只返回:
array (
0 =>
array (
0 => '{{Friday}}',
1 => '{{Sunday}}',
),
1 =>
array (
0 => '{{Friday}}',
1 => '{{Sunday}}',
),
'inside' =>
array (
0 => 'Friday',
1 => 'Sunday',
),
2 =>
array (
0 => 'Friday',
1 => 'Sunday',
),
'outside' =>
array (
0 => '',
1 => '',
),
3 =>
array (
0 => '',
1 => '',
),
)
上面的数组中没有关于“今天”的内容。
有趣的是,当模式的各个部分相互替换时,结果中既没有“星期日”也没有“星期日”值,只有“今天”。
看起来只考虑模式的第一部分。
获取所有值的模式是什么?谢谢。
已编辑:
1.感谢真正伟大的答案。但我必须稍微扩展一下这个问题。我测试了你的所有命题,它们对字符串很有用
{{Friday}}today{{Sunday}}
但它们不适用于这样的字符串:
{{Friday}}t{od{a}y{{Sunday}}
结果中应该是这样的值
t{od{a}y
因为只有双花括号应该是定界符。
我尝试根据这些要求调整您的出色模式,但没有成功。子字符串 '}}' 和 '{{' 应该取反。不仅是单个“{”或“}”。
如何获取?
2.另一个不那么重要的问题是“内部”和“外部”结果数组不应该有空字符串。在图片上看到我的意思: enter image description here
最佳答案
这里是 my solution :
$re = "/{{(?<inner>.*?)}}|(?<outer>[^{}]*(?:{(?!{)[^{}]*|}(?!})[^{}]*)*)/";
$str = "{{Friday}}today{{Sunday}}";
preg_match_all($re, $str, $matches);
print_r(array_filter($matches["outer"]));
print_r(array_filter($matches["inner"]));
为什么看起来这么复杂?
正则表达式包含 2 个选项,一个用于捕获 {{
内的所有子字符串和 }}
进入“内部”组,“外部”组捕获除内部 {{
之外的所有子字符串和 }}
.让我解释一下这些模式:
第 1 部分:
{{(?<inner>.*?)}}
这会找到并使用 {{
子字符串,后跟除换行符以外的零个或多个字符(在正则表达式末尾使用 /s
dotall 修饰符也匹配换行符),零次或多次出现(使用 .+?
匹配一个或多个),如 few尽可能(意味着我们停在第一个 }}
)。然后,}}
匹配。
第 2 部分:
(?<outer>[^{}]*(?:{(?!{)[^{}]*|}(?!})[^{}]*)*)
此子模式等于 (?<outer>(?:(?!{{(?!{)|}}(?!})).)*)
, 但它是这个 tempered greedy token 的展开版本(因此比具有 2 个备选方案的缓和贪婪 token 更有效)。它只匹配非大括号 [^{}]*
(零个或多个)后跟 {
的零个或多个序列(=可选匹配)没有跟着另一个{
或 }
没有跟着另一个}
然后是零个或多个非大括号。
array_filter
从结果数组中删除空元素。
这是一个 regex demo
关于php - preg_match_all 'OR' 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35491083/
我有这个正则表达式 {{([ a-zA-Z0-9_\-]+)\s*(?:\[([ a-zA-Z0-9_\-]+)\]\s*)*}} 我需要匹配如下字符串: {{word with spaces}} {
我有这个子模式: 它的结果是这样的输出: php test.php Array ( [0] => Array ( [0] => d
你好我想提取链接 我想要一个正则表达式给我/portal/clients/show/entityId/2121最后2121的数字在其他链接中不同有什么想法吗? 最佳答案 Simple PHP HTML
我试图提取所有 img 来自 HTML 字符串的标签。看代码 $d1 = file_get_contents("http://itcapsule.blogspot.com/feeds/post
我正在尝试为我们的防火墙创建报告功能。 防火墙规则以 json 格式存储。 这是字符串的示例。 [{"id":1,"enabled":true,"description":"TEMP","matche
我需要从文本 block 中提取一组预定义的主题标签,然后提取紧随其后的数字(如果有)。例如。我需要从“带有#other30 标签的测试字符串”中提取 30。我认为 preg_match_all 是正
我正在尝试从可能很大的文本中提取 ID,我错过了什么? preg_match_all('/(ID\s\d+)/', "ID 20380843, ID 20675712", $matches); pr
我正在尝试抓取 html 并抓取 之间的项目标签。由于某种原因( ),某些标签以大写形式出现,并且被我的模式忽略。我如何告诉我的模式忽略大小写。 我当前的模式是: preg_match_all("
我有一个从另一个网站读取数据的脚本,但我希望该脚本从下向上而不是从上向下获取数据。 例如,如果结果是: 结果#1结果#2结果#3 我想先得到#3,然后是2,然后是1。目前它得到的是1,然后是2,然后是
我有一个网址: https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2o
在使用正则表达式时遇到问题(它们不是我的强项)。我试图匹配 {{ 和 }} 之间的所有字符串,但如果一组括号出现在同一行上,则会将其视为单个匹配...示例: $string = " Hello,
我有一个始终遵循以下格式的字符串: This Fee Name : * Fee Id * Fee Amount $* is required for this activity 例子: Thi
我在使用 php (preg_match_all) 中的正则表达式时遇到了一些问题。 我正在使用以下代码查找由 <>: 封装的电子邮件,即: preg_match_all(":", $body,$ma
我有这个脚本可以从另一个网站读取数据,但我希望脚本从下到上而不是从上到下获取数据。 例如如果结果是: 结果 #1结果 #2结果 #3 我想先得到#3,然后是 2,然后是 1。目前它是 1,然后是 2,
我有一个网址: https://my.site.com/u/0/ac?export=download&confirm=45vy&id=qNhdhk1jejhXLexLpY3RiDY2o
我正在尝试获取点后的值,并且我想获取所有这些点(每个都是它们自己的键/值)。 以下是我正在运行的内容: $string = "div.cat.dog#mouse"; preg_match_all("/
这个问题已经有答案了: "Regular Expression is too large" error in PHP (3 个回答) 已关闭 3 年前。 我该如何改进以下preg_match_all模
我不知道为什么,但是当我执行脚本时,它没有正确显示这些行。它只是返回可变行的最后一行,下面没有输入。我是不是忽略了什么? 文件1: 06BAH TOI00123-11-134-B
我想检查 'n' 分解这个字符串: {$gallery#pager/collectionName/imageName/manual/no_effect/foo1/foo2/.../fooN} 到: v
我尝试先阅读其他问题,但没有发现任何有用的东西。 我在自己的 PC 上有一个装有 PHP 5.3.28 和 PHP 5.4.7 的开发服务器。 $string = 'Match this'; preg
我是一名优秀的程序员,十分优秀!