1

我想知道如何匹配所有标签"<?""?>" 例如:

"<?root?><abcd>"

我想:

preg_match_all(/[^(<\?)(\?>)]+/, $str, $match);

但结果["root", "abcd"]相反,我愿意这样["<abcd>"]

谢谢'!

4

3 回答 3

3
<(?!\?).+?(?<!\?)>

这应该够了吧。

解释:

<    -- A <
(?!  -- Not followed by: (See link 1 - Positive and Negative Lookahead)
  \? -- A ?
)
.+?  -- As few characters as necessary (See link 2 - Laziness Instead of Greediness)
(?<! -- Not preceded by: (See link 1 - Positive and Negative Lookbehind)
  \? -- A ?
)
>    -- A >
  1. 环视四周
  2. 重复

IIRC,你会这样做:

preg_match_all('/<(?!\?).+?(?<!\?)>/', $str, $match);

但是,使用 regex 解析 HTML 并不是一个好主意

于 2012-06-07T13:03:52.250 回答
2

我当然希望这不是 HTML,但这将匹配尖括号括起来的单词,中间没有问号:

/<\w+>/

如果里面允许有其他\w字符但没有问号:

/<[^>?]+>/

如果问号可以在里面,但只有在与尖括号相邻时才被拒绝:

/<[^?].*?[^?]>/

<b>但是,由于最小长度限制,上述内容将具有无法匹配的副作用。

于 2012-06-07T13:02:46.497 回答
0

这是微不足道的,但你以错误的方式接近它。你应该匹配你想要的,而不是不匹配你不想要的。要匹配标签,请使用以下变体:

<\w+[^>\?]*>

根据您的需要使其具体化。只要\?不在标签中允许的字符集中,就可以了。另请注意,这会将标签与属性匹配。

于 2012-06-07T13:06:49.617 回答