@ (at)符号preg_replace函数


@ (at) symbols preg_replace function

"@"符号有时用于包围PHP正则表达式吗?我正在使用一个代码库,发现了这个函数调用:

$content = preg_replace("@(</?[^>]*>)+@", "", $content);

我相信它从字符串中删除了所有XML标签,但我不确定那里的"@"符号是什么意思。

是的,它可以用来包装表达式。原作者很可能会这样做,因为一些(或几个)表达式包含"更传统的"/分隔符。通过使用@,您现在可以使用/而无需转义。

你可以使用:

  • /pattern/flags(传统)
  • @pattern@flags
  • $pattern$flags
  • 等。

手册称它们为PCRE "分隔符"。可以使用任何ASCII符号(非字母数字)(空字节除外)。

/的常见替代品是~#。但@同样有效。

PCRE还允许正则表达式匹配像(...)<...>这样的大括号。

在PHP正则表达式中几乎可以使用任何标点符号作为分隔符。请参阅此处的文档。通常,/是首选(我建议在这里使用它),但如果您的regex包含斜杠,则使用不同的字符可能会很有用。

大多数情况下,我见过%...%, ~...~#...#,但@...@也可以。

简短的回答是肯定的。具体使用的符号并不重要;它通常应该是在模式中没有出现的东西。例如,这些都是等价的:

<?php
    preg_replace("@(<'?[^>]*>)+@", "", $content);
    preg_replace("/(<'?[^>]*>)+/", "", $content);
    preg_replace("!(<'?[^>]*>)+!", "", $content);  
?>

需要这个符号的原因是修饰符可以加在表达式后面。例如,要搜索不区分大小写,您可以使用:

<?php
   preg_replace("@(<'?[^>]*>)+@i", "", $content);
?>