我想在字符串中找到基于数字的子字符串的位置
$str = " test No. 82 and No. 8 more No. 234";
$needle = "No. 8";
我尝试strpos
作为
$index = stripos($str,$needle);
但它找到了No. 82
而不是No. 8
。
将preg_match
与PREG_OFFSET_CAPTURE
一起使用是最简单的方法吗?它真的必须regex
吗?
答案 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];
。