문제
다음 예를 고려하십시오.
$target = 'Xa,a,aX';
$pattern = '/X((a),?)*X/';
$matches = array();
preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
var_dump($matches);
그것이하는 일은 시리즈에서 마지막 'a'만 반환하는 것입니다. 그러나 내가 필요한 것은 모든 'a입니다.
특히, 나는 위치가 필요합니다 모두 각각 'A는 문자열 안에 있습니다 갈라져, 따라서 preg_offset_capture.
예제는 훨씬 더 복잡합니다. 관련 질문을 참조하십시오. 배열과 일치하는 패턴은 그 자체로 요소가 아닙니다.
감사
해결책
Regex 이후 단일 경기를 그룹화합니다 X((a),?)*X
전체 문자열과 일치합니다. 마지막 ((a),?)
그룹화됩니다.
당신이 일치하고 싶은 것은 An입니다 a
그것은 있습니다 X
그것 (그리고 줄의 시작) 앞에 쉼표가 있거나 그 앞에 쉼표가 있거나 X
그것보다 앞서 (그리고 문자열의 끝).
$target = 'Xa,a,aX';
$pattern = '/(?<=^X)a|a(?=X$|,)/';
preg_match_all($pattern, $target, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
산출:
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => 1
)
[1] => Array
(
[0] => a
[1] => 3
)
[2] => Array
(
[0] => a
[1] => 5
)
)
)
다른 팁
REGEX에 X가 포함되면 한 번 일치합니다. 그룹과 하나의 큰 일치를 찾습니다. 당신이 원하는 것은 각각 고유 한 위치를 가진 많은 경기입니다.
따라서 제 생각에는 최선을 다하면 단순히 / a / 또는 / a,? / x가없는 것입니다. 그러면 일치하는 [0]은 'a'의 모든 모양을 포함합니다.
x 사이에 필요한 경우 문자열 의이 부분을 사전 선택하십시오.
제휴하지 않습니다 StackOverflow