Как я могу заставить preg_match_all соответствовать угловым скобкам?

Я знаю, что это, вероятно, глупый вопрос, но я застрял, пытаясь понять, как заставить preg_match_all делать то, что я хочу...

Я хочу сопоставить строки, которые выглядят как ‹[someText]> Кроме того, я хотел бы сделать это ленивым способом, поэтому, если у меня есть строка, подобная

$myString = '<[someText]> blah blah blah <[someOtherText]> lala [doNotMatchThis] ';

Я хотел бы иметь 2 совпадения: '‹[someText]>' и '‹[someOtherText]>', а не одно совпадение '‹[someText]> бла-бла-бла ‹[someOtherText]>'

Я пытаюсь сопоставить это со следующим шаблоном

$pattern = '<\[.+?\]>';

но по какой-то причине я получаю 3 совпадения: [someText], [someOtherText] и [doNotMatchThis]

Это заставляет меня поверить, что по какой-то причине угловые скобки мешают, что я нахожу странным, потому что они не должны быть метасимволами.

Что я делаю неправильно?


person Emil D    schedule 25.11.2011    source источник


Ответы (2)


У вас отсутствуют правильные разделители (ваши < > считаются разделителями в этом случае)

$pattern = '~<\[.+?\]>~';
person Martin.    schedule 25.11.2011

Вашему шаблону нужны разделители (теперь < и > "видятся" как разделители).

Попробуй это:

$pattern = '/<\[.+?\]>/';

Последующий:

$myString = '<[someText]> blah blah blah <[someOtherText]> lala [doNotMatchThis] ';
$pattern = '/<\[.+?\]>/';
preg_match_all($pattern, $myString, $matches);
print_r($matches);

будет печатать:

Array
(
    [0] => Array
        (
            [0] => <[someText]>
            [1] => <[someOtherText]>
        )

)
person Bart Kiers    schedule 25.11.2011