Как я могу получить preg_match_all, чтобы соответствовать угловым скобкам? - PullRequest
1 голос
/ 26 ноября 2011

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

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

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

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

Я пытаюсь сопоставить это со следующей схемой

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

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

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

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 26 ноября 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]>
        )

)
2 голосов
/ 26 ноября 2011

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

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