preg_match,查找和提取

时间:2014-08-08 16:02:21

标签: php regex preg-match

我正在使用它来确定字符串是否与正确的URL一样,然后提取值

if (preg_match('#^(https?:\/\/)?(www.)?site.com\/cat\/(aaa\d{5,30})\/#', $url, $urlid)) {

   echo $urlid[3];

}

它运作正常,但我认为它可能更精益/改进(或者更好的练习)。我应该添加一些“负面预测”,“非捕获”还是其他?

这个例如(https?:\/\/)?(www.)?只是一个简单的想法。它有效,但......它真的应该在括号中还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

你可以这样写:

if (preg_match('~^(?:https?://)?(?:www\.)?site\.com/cat/(aaa\d{5,30})/~', $url, $urlid))
    echo $urlid[1];

改进:

  • 当您不需要捕获某些内容时,无需使用捕获组,而是使用非捕获组(?:...)
  • 当它不用作分隔符时,无需转义/
  • 你需要逃避.,否则它不会被视为文字角色

优点:

  • 由于\.匹配点而不是其他角色
  • ,因此模式不再模糊
  • 它更具可读性,因为没有更多无用的反斜杠
  • 使用非捕获组的小内存/速度增益