php preg_match获取两个字符串之间的数字

时间:2013-12-28 21:25:05

标签: php regex preg-match

您好我开始学习php正则表达式并遇到以下问题: 我需要提取$ string中的数字。 我使用的正则表达式返回“NULL”。

$string = 'Clasificación</a> (2194)  </li>';
$regex = '/Clasificación</a>((.*?))</li>/';
preg_match($regex , $string, $match);
var_dump($match);

提前致谢。

3 个答案:

答案 0 :(得分:4)

你的正则表达式存在三个问题:

  • 你没有逃脱正斜杠。您正在使用正斜杠作为分隔符,因此如果您想将其用作表达式中的文字字符,则需要将其转义。
  • ((.*?))并不能按照您的想法行事。它创建了两个捕获组 - 一个嵌套在另一个中。我想,你正试图捕捉括号内的内容。为此,您需要转义()个字符。表达式将变为:\((.*?)\)
  • 你的表达不处理空格。在您提供的字符串中,</a>与数字开头之间有空格 - </a> (2194)。要忽略空格并仅捕获数字,您需要使用\s(匹配任何空白字符)。为此,您需要编写\s*\((.*?)\)\s*

修复所有上述错误后的最终正则表达式如下所示:

$regex = '~Clasificación</a>\s*\((.*?)\)\s*</li>~';

完整代码:

$string = 'Clasificación</a> (2194)  </li>';
$regex = '~Clasificación</a>\s*\((.*?)\)\s*</li>~';
preg_match($regex , $string, $match);
var_dump($match);

输出:

array(2) {
  [0]=>
  string(32) "Clasificación (2194)  "
  [1]=>
  string(4) "2194"
}

Demo.

答案 1 :(得分:2)

您忘记在正则表达式中/,因为您使用/作为分隔符:

$regex = '/Clasificación<\/a>((.*?))<\/li>/';
//        ^ delimiter    ^^               ^ delimiter
//                       ^^ / in a string which is escaped

另一种方法是更改​​分隔符,然后你就不必逃避它:

$regex = '#Clasificación<\/a>((.*?))<\/li>#';

有关详细信息,请参阅PHP documentation

答案 2 :(得分:2)

你必须逃脱你想要匹配的特殊字符:

$regex = '/Clasificación<\/a> \((.*?)\) <\/li>/'

并且可能希望在重要的地方(取决于您的使用案例)使您的匹配更具体一些

$regex = '/Clasificación<\/a>\s*\(([0-9]+)\)\s*<\/li>/'; 

允许在(1234)之前或之后的0或更多空格,并且只有在()

中只有数字时才匹配

我刚在php中试过这个:

php > preg_match($regex , $string, $match);
php > var_dump($match);
array(2) {
  [0]=>
  string(30) "Clasificacin</a> (2194)  </li>"
  [1]=>
   string(4) "2194"
}