嗨我的问题很简单:
我只想匹配文章中所有可能的主题标签,前提是它们位于<figcaption>
使用 PCRE 正则表达式。例如:
<figcaption>blah blah #hashtag1, #hashtag2</figcaption>
我在这里做了尝试https://regex101.com/r/aL9vS8/1 https://regex101.com/r/aL9vS8/1并删除最后一个?
会改变捕获#hashtag1
to #hashtag2
但不能两者兼得。
我什至不确定它是否可行PHP 中的一个正则表达式.
有什么想法可以帮助我吗? :)
如果单个正则表达式没有办法(真的吗?即使使用递归(?R)?
? :p),请建议性能方面最有效的方法。
谢谢你!
[EDIT]
如果没有办法,我的 PHP 下一个想法是:
- 将每个 Figcaption 与
preg_replace_callback
- 在回调中匹配每个实例
#hashtag
.
我可以听听您对此的看法吗?有没有更好的办法?我的文章不是很长。
请建议性能方面最有效的方法
使用 PCRE 正则表达式匹配某些分隔符之间的某些文本的最可靠方法是使用自定义边界\G操作员 http://perldoc.perl.org/perlretut.html#Global-matching。但是,尾随边界是多字符字符串,并且匹配除</figcaption>
你需要一个脾气暴躁的贪婪令牌 https://stackoverflow.com/a/37343088/3832970。由于此令牌非常消耗资源,因此必须将其展开。
这是适合您任务的快速、可靠的 PCRE 正则表达式:
(?:<figcaption|(?!^)\G)[^<#]*(?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*\K#\w+
See the 正则表达式演示 https://regex101.com/r/aL9vS8/3
Details:
-
(?:<figcaption|(?!^)\G)
- 火柴<figcaption
或上一次成功匹配的结束
更多细节:
(?:<figcaption|(?!^)\G)
is a 非捕获组 ((?:...)
)这意味着仅进行分组,而不是跟踪与该组匹配的内容(即,由于未创建堆栈,因此组堆栈中没有保留任何值)匹配 2 个替代项(|
是交替运算符):1)文字文本<figcaption
or 2) (?!^)\G
- 上一次成功匹配之后的位置(请注意\G
也匹配字符串的开头,因此,我们必须添加负向前瞻(?!^)
排除该行为)。
-
[^<#]*
- 0+ 个字符以外的字符<
and #
-
(?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*
- 0+ sequences of:
-
(?:<(?!\/figcaption>)|#\B)
- a <
没有跟随/figcaption>
or #
后面没有单词 char
-
[^<#]*
- 0+ 个字符以外的字符<
and #
-
\K
- 省略目前匹配的文本
-
#\w+
- #
和 1+ 个单词字符
更多细节:
-
\K http://www.pcre.org/pcre.txt:
转义序列\K
导致任何先前匹配的字符不包含在最终匹配的序列中。例如,该模式:
foo\Kbar
火柴foobar
,但报告它已匹配bar
。此功能类似于后向断言。
-
(?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*
:这里,我们有一个外部非捕获组(?:...)*
允许匹配子模式序列零次或多次(我们可以设置一个量词*
如果我们需要重复一个分组,则只对一个分组sequence子模式)和内部非捕获组(?:<(?!\/figcaption>)|#\B)[^<#]*
只是一种缩小更长的方法<(?!\/figcaption>)[^<#]*|#\B[^<#]*
(只是为了将 2 个不同的替代方案分组<(?!\/figcaption>)
and #\B
在常见的“后缀”之前[^<#]*
.
- 包裹在标签中:只需使用
preg_replace
与<span class="highlight">$0</span>
替换模式:
Code:
$re = '~(?:<figcaption|(?!^)\G)[^<#]*(?:(?:<(?!\/figcaption>)|#\B)[^<#]*)*\K#\w+~';
$str = "<figcaption>blah # blah #hashtag1, #hashtag2</figcaption> #ee <figcaption>#ddddd";
$subst = "<span class=\"highlight\">$0</span>";
$result = preg_replace($re, $subst, $str);
echo $result;
See the PHP IDEONE 演示 https://ideone.com/fO2F7P
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)