如何在PHP中查找字符串中的数字位置

时间:2016-10-26 10:58:00

标签: php regex preg-match

我想在字符串中找到基于数字的子字符串的位置

$str = " test No. 82 and No. 8 more No. 234";
$needle = "No. 8";

我尝试strpos作为

$index = stripos($str,$needle);

但它找到了No. 82而不是No. 8

preg_matchPREG_OFFSET_CAPTURE一起使用是最简单的方法吗?它真的必须regex吗?

2 个答案:

答案 0 :(得分:3)

"正则表达式"对于这种复杂的情况,方法会更好,preg_match_all函数可以完成这项任务:

$str = " test No. 82 and No. 8 more No. 234";
preg_match_all("/No\.\s+\d+\b/", $str, $matches, PREG_OFFSET_CAPTURE);

print_r($matches[0]);

根据搜索$needle的附加条件:
- 我们应该考虑搜索的正确边界" needle"使用元字符\b

$str = " test No. 82 and No. 8 more No. 234";
$needle = "No. 8";
preg_match_all("/$needle\b/", $str, $matches, PREG_OFFSET_CAPTURE);

print_r($matches[0]);

输出:

Array
(
    [0] => Array
        (
            [0] => No. 8
            [1] => 17
        )
)

答案 1 :(得分:1)

您需要一个正则表达式来匹配精确的序列模式。我建议这个apporach:

<?php
$subject = " test No. 82 and No. 8 more No. 234";
$pattern = '/No\. \d+/';
$offset = 0;
while (preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, $offset+1)) {
    $offset = $matches[0][1];
    var_dump($matches);
}

当然可以进一步处理的输出是:

array(1) {
  [0] =>
  array(2) {
    [0] =>
    string(6) "No. 82"
    [1] =>
    int(6)
  }
}
array(1) {
  [0] =>
  array(2) {
    [0] =>
    string(5) "No. 8"
    [1] =>
    int(17)
  }
}
array(1) {
  [0] =>
  array(2) {
    [0] =>
    string(7) "No. 234"
    [1] =>
    int(28)
  }
}

根据您的具体要求,您可能希望将模式修改为'/No\. (\d+)/'以完全匹配数字部分。您还必须明确调整偏移线到$offset = $matches[1][1];