假设我有这样的preg_replace:
preg_replace("/\{{2}([a-z]+\|*.*)\}{2}/Ue", 'Im here', $Input);
它将取代例如{{youtube}}带有“我在这里”或{{youtube | id = something}},效果很好。但是,如果我想在不更换的情况下显示它呢?我基本上想要这样的东西:
\{{youtube}}
哪个不会得到解决。有可能吗?
答案 0 :(得分:1)
您可以使用preg_match()
并列出匹配而不替换它们。
答案 1 :(得分:0)
我认为你应该学习搜索手册。只需使用preg_match_all()
即可。另外请不要使用e
修饰符。它代表eval
,它被弃用并且很危险。如果要在替换时应用某些逻辑,则应使用preg_replace_callback()
。至于你正在使用的表达方式,它可以改进,虽然其中一些只是我的偏好:
\{{2}
:使用\{\{
会更短,但我会选择{{
,因为PCRE很聪明,知道它不是量词。结束标记也是如此。([a-z]+\|*.*)
:我不明白为什么你不只是使用.*
?如果你希望它以字母开头,那么我认为你也应该包括大写字母。U
:我认为这个修饰符很痛苦,让正则表达式难以理解。因此,当有人读到表达式时,他总是要记住,有一个不情愿的修饰符。我会删除此修饰符,并使用.*?
明确记下.*
而不是U
。e
:就像我说的那样危险,不应该使用。最后,我认为最好使用{{.*?}}
或{{[a-zA-Z].*?}}
,如果您希望以字母开头,或{{([a-zA-Z].*?)}}
,如果您想捕获其中的值{{}}
。请注意,此表达式与嵌套标记不匹配。这是一个简单的php示例:
$input = 'this is a test {{youtube}} also this {{youtube|id=something}} is something special.';
preg_match_all('~{{([a-zA-Z].*?)}}~', $input, $m);
print_r($m);
输出:
Array
(
[0] => Array
(
[0] => {{youtube}}
[1] => {{youtube|id=something}}
)
[1] => Array
(
[0] => youtube
[1] => youtube|id=something
)
)
请注意,我使用~
作为分隔符而不是/
,因此我不需要在表达式中转义/
。
Play 点击此处播放