الحصول على محتويات الأقواس المربعة ، وتجنب الأقواس المتداخلة

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

سؤال

(ملصق لأول مرة ، زائر طويل عبر Google)

أحاول استخلاص محتويات بعض الأقواس المربعة ، ومع ذلك أواجه مكانًا من الإزعاج. لقد جعلتها تعمل من أجل أقواس مستديرة كما هو موضح أدناه ، لكن لا يمكنني أن أرى كيف ينبغي تعديلها للعمل في قوسين مربع. كنت أفكر في استبدال الجولة للمربع والعكس بالعكس في هذا المثال يجب أن يعمل ، ولكن على ما يبدو لا.

يحتاج إلى تجاهل الأقواس داخل الأقواس. لذلك لن يعود (11) ولكن سيعود (10 (11) 12).

$preg = '#\(((?>[^()]+)|(?R))*\)#x';
$str = '123(456)(789)(10(11)12)';

if(preg_match_all($preg, $str, $matches)) {
    $matches = $matches[0];
} else {
    $matches = array();
}

echo '<pre>'.print_r($matches,true).'</pre>';

This returns:

Array (
    [0] => (456)
    [1] => (789)
    [2] => (10(11)12)
)

وهو مثالي. ومع ذلك ، كيف يمكنني الحصول على هذا العمل لسلسلة ذات قوسين مربع بدلاً من ذلك على سبيل المثال:

$str = '123[456][789][10[11]12]'; 
هل كانت مفيدة؟

المحلول

$preg = '#\[((?>[^\[\]]+)|(?R))*\]#x';

نصائح أخرى

جرب هذا:

$str = '123[456][789][10[11]12]';
$pattern = '/(([\d]+)|(\[[\d]+\])|\[[\d\[\]]+\])/';
preg_match_all($pattern,$str,$matches);
print_r($matches[0]);
//or
$str = '123[456][789][10[11]12]';
$pattern = '/(([\d]+)|(\[[\d]+\]))/';
preg_match_all($pattern,$str,$matches);
print_r($matches[0]);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top