【问题标题】:PHP regex delimiters, / vs. | vs. {} , what are the differences?PHP 正则表达式分隔符,/ vs. |与 {} 有什么区别?
【发布时间】:2010-05-23 17:44:59
【问题描述】:

在PCRE的PHP手册http://us.php.net/manual/en/pcre.examples.php中,给出了4个有效模式的例子:

  • /<\/\w+>/
  • |(\d{3})-\d+|Sm
  • /^(?i)php[34]/
  • {^\s+(\s+)?$}

好像/、|或者一对花括号都可以作为分隔符,那么它们之间有什么区别吗?

【问题讨论】:

  • 我很惊讶 [] 和 {} 用作开始/结束分隔符。我认为起始分隔符必须与结束分隔符相同。但是,是的,您几乎可以使用任何您想要的东西。我经常使用% 作为分隔符,因为我很少使用% 作为我的模式中的实际字符。
  • 在匹配对中使用“类括号”分隔符,就像分隔符概念本身一样,与 Perl 的正则表达式字面量一致(在此之前可能还有 awk 等)。
  • 我发现这个页面有一个很好的解释:rexegg.com/regex-php.html

标签: php regex


【解决方案1】:

没有区别,除了结束分隔符不转义就不能出现。

这在大量使用标准分隔符时很有用,例如而不是

preg_match("/^http:\\/\\/.+/", $str);

你可以写

preg_match("[^http://.+]", $str);

避免需要转义/。

【讨论】:

  • @KennyTM - 手册中没有提到[]的使用,但它是有效的,对吧?
  • 我不认为 [^http://.+] 会起作用,因为它会错误地匹配任何不是 h,t,p 等之一的字符。#^http:// .+# 或 ~^http://.+~ 也可以。
  • @Kenny:这是一个可怕的例子!
  • @powerboy 手册 确实 提到使用 […] 作为分隔符:除了上述分隔符之外,还可以使用括号样式分隔符,其中左括号和右括号分别是开始和结束分隔符。 source
  • 请注意,尽管被用作正则表达式分隔符,方括号仍可按正常方式使用:preg_replace("[[fo]]", "x", "foo") 产生xxx。只有“杂散”的右括号必须被转义。这是从 Perl 复制的另一个功能。
【解决方案2】:

事实上,您可以使用任何非字母数字分隔符(不包括空格和反斜杠)

"%^[a-z]%"

效果很好

"*^[a-z]*"

还有

"!^[a-z]!"

【讨论】:

  • 空白字符和反斜杠是非字母数字字符,但不允许作为分隔符。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多