我正在为我正在使用的一些方法编写一些单元测试,并且发现了一个奇怪的错误并想要一些Regex建议。
做的时候: -
$needle = ' ';
$haystack = 'hello world. this is a unit test.';
$pattern = '/\b' . $needle . '\b/';
preg_match_all($pattern, $haystack, $matches, PREG_OFFSET_CAPTURE, $offset)
我希望这些职位能够找到职位
[5, 12, 17, 20, 22, 27]
就像我这样做一样,没有完全匹配的单词匹配
while (($pos = strpos($haystack, $needle, $offset)) !== false) {
$offset = $pos + 1;
$positions[] = $pos;
}
然而,preg_match_all没有找到第二次出现(12)
之间的空格. this
这与\ b边界标志有关吗?我如何解决这个问题,以确保它能够解决这个问题?
由于
答案 0 :(得分:1)
您必须更改$pattern
中的preg_match_all()
,如下所示: -
<?php
$haystack = 'hello world. this is a unit test.';
while (($pos = strpos($haystack, ' ', $offset)) !== false) {
$offset = $pos + 1;
$positions[] = $pos;
}
echo "<pre/>";print_r($positions);
preg_match_all('/\s/', $haystack, $matches,PREG_OFFSET_CAPTURE);
echo "<pre/>";print_r($matches);
输出: - https://eval.in/725574
注意: - 您需要使用\s
来检查空格
您可以根据if-else
应用$pattern
更改$needle
: -
if($needle == ''){
$pattern = '/\s/';
}else{
$pattern = '/\b' . $needle . '\b/';
}