如何让preg_match_all匹配尖括号?

时间:2011-11-25 20:28:31

标签: php regex preg-match-all

我知道这可能是一个愚蠢的问题,但我一直试图弄清楚如何让preg_match_all做我想做的事......

我想匹配看起来像< [someText]>的字符串 另外,我想以一种懒惰的方式做这件事,所以如果有一个像

这样的字符串
$myString = '<[someText]> blah blah blah <[someOtherText]> lala [doNotMatchThis] ';

我想要2场比赛:'&lt; [someText]&gt;'和'&lt; [someOtherText]&gt;'而不是单个匹配'&lt; [someText]&gt; blah blah blah&lt; [someOtherText]&gt;'

我试图将此与以下模式相匹配

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

但出于某种原因,我得到了3场比赛:[someText],[someOtherText]和[doNotMatchThis]

这使我相信由于某种原因,尖括号是干扰的,我觉得这很奇怪,因为它们不应该是元字符。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的模式需要分隔符(现在<>被“视为”分隔符。

试试这个:

$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]>
        )

)

答案 1 :(得分:2)

您错过了正确的分隔符(在这种情况下,您的< >被视为分隔符)

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