如何将正则表达式显示为纯文本而不是将其解析为PHP

时间:2014-03-02 10:03:02

标签: php regex

假设我有这样的preg_replace:

preg_replace("/\{{2}([a-z]+\|*.*)\}{2}/Ue", 'Im here', $Input);

它将取代例如{{youtube}}带有“我在这里”或{{youtube | id = something}},效果很好。但是,如果我想在不更换的情况下显示它呢?我基本上想要这样的东西:

\{{youtube}}

哪个不会得到解决。有可能吗?

2 个答案:

答案 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 点击此处播放