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/';
}