preg_match_all пробелы с регулярными выражениями

Я пишу некоторые модульные тесты для некоторых методов, которые я использую, и обнаружил странную ошибку и хотел бы получить совет 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 не находит 2-го вхождения (12) пространство между

. this 

Это связано с \b пограничным флагом? Как я могу решить это, чтобы убедиться, что он подхватывает другие это?

Спасибо

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/';
}
Другие вопросы по тегам