preg_match或类似的从字符串中获取值

时间:2011-01-24 04:39:36

标签: php regex string preg-match

我对preg_match或类似的不被弃用的函数不满意。

这是两个字符串:

  1. /Cluster-Computers-c-10.html

  2. /Mega-Clusters-c-15_32.html

  3. 我想知道:

    在第1个示例中,如何获取-c-.html之间的值(示例中的值为10)。该值始终为整数(数字)

    在第2个示例中,如何获取-c-.html之间的值(示例中的值为15_32)。该值始终是由_

    分隔的整数

    基本上我想做的是检查字符串是否有c-10.htmlc-15_32.html并获取值并将其传递给数据库。

4 个答案:

答案 0 :(得分:3)

preg_match('~-c-(.*?)\.html$~', $str, $matches)
var_dump($matches);

答案 1 :(得分:3)

你可以这样做:

preg_match('/-c-(\d+(?:_\d+)?)\.html$/i',$str);

说明:

-c-     : A literal -c-
(       : Beginning of capturing group
 \d+    : one or more digits, that is a number
 (?:    : Beginning of a non-capturing group
   _\d+ : _ followed by a number
 )      : End of non-capturing group
 ?      : Makes the last group optional
)       : End of capturing group
\.      : . is a metacharacter to match any char (expect newline) to match 
          a literal . you need to escape it.
html    : a literal html
$       : End anchor. Without it the above pattern will match any part 
          of the input string not just the end.

See it

答案 2 :(得分:1)

/-c-(\d+(?:_\d+)?)\.html$/i

-c-寻找-c-
(\d+(?:_\d+)?)匹配号码或号码 - 下划线号码 \.html一段时间和尾随html
$强制它匹配行的结尾
i不区分大小写的匹配

示例:

<?php
  header('Content-Type: text/plain');
  $t = Array(
    '1) /Cluster-Computers-c-10.html',
    '2) /Mega-Clusters-c-15_32.html'
  );
  foreach ($t as $test){
    $_ = null;
    if (preg_match('/-c-(\d+(?:_\d+)?)\.html$/i',$test,$_))
      var_dump($_);
    echo "\r\n";
  }
?>

输出:

array(2) {
  [0]=>
  string(10) "-c-10.html"
  [1]=>
  string(2) "10"
}

array(2) {
  [0]=>
  string(13) "-c-15_32.html"
  [1]=>
  string(5) "15_32"
}

工作代码:http://www.ideone.com/B70AQ

答案 3 :(得分:0)

我看到的最简单的方法是:

preg_match( '/-c-([^.]+)\.html/i', $url, $matches );
var_dump( $matches );