PHP совпадение регулярного выражения - PullRequest
2 голосов
/ 23 апреля 2020

С учетом входной строки " othertext? .Ab c .de.fgh.i moretext " и шаблона '/ \? (\. [A-zA-Z] * ) * / ' Я пытаюсь использовать функцию preg_match_all, чтобы получить массив совпадений с элементами .ab c, .de , .fgh и .i , но совпадают только ?. ab c .de.fgh.i и .i . ( Тест )

1 Ответ

5 голосов
/ 23 апреля 2020

Вы можете использовать \G якорь

(?:\?|\G(?!^))\K\.[a-zA-Z]+

По частям:

  • (?: Группа без захвата
    • \? Матч ?
    • | Или
    • \G(?!^) Утверждение позиции в конце предыдущего матча, а не в начале
  • ) Закрыть группу
  • \K\.[a-zA-Z]+ Забыть то, что в настоящее время соответствует, и сопоставить символы . и 1+ a-zA-Z

Regex demo | Php демо

$re = '/(?:\?|\G(?!^))\K\.[a-zA-Z]+/';
$str = 'othertext ?.abc.de.fgh.i moretext';

preg_match_all($re, $str, $matches);
var_dump($matches[0]);

Выход

array(4) {
  [0]=>
  string(4) ".abc"
  [1]=>
  string(3) ".de"
  [2]=>
  string(4) ".fgh"
  [3]=>
  string(2) ".i"
}
...