الحصول على موقف كل المباريات في المجموعة

StackOverflow https://stackoverflow.com/questions/1800236

  •  05-07-2019
  •  | 
  •  

سؤال

النظر في المثال التالي:

$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 داخل السلسلة بشكل منفصل, وبالتالي PREG_OFFSET_CAPTURE.

على سبيل المثال هو أكثر تعقيدا بكثير ، انظر ذات السؤال: مطابقة نمط مجموعة لا عناصرها في حد ذاتها

شكرا

هل كانت مفيدة؟

المحلول

مجموعات مباراة واحدة منذ regex X((a),?)*X مباريات السلسلة بأكملها.آخر ((a),?) سيتم تجميع.

ماذا تريد أن المباراة هو 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,?/ دون أي X.ثم مباريات[0] سوف تحتوي على جميع المظاهر من 'a'

إذا كنت في حاجة إليها بين X, قبل اختيار هذا الجزء من السلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top