문제

다음 예를 고려하십시오.

$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 사이에 필요한 경우 문자열 의이 부분을 사전 선택하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top