我想知道如何匹配所有标签"<?"
,"?>"
例如:
"<?root?><abcd>"
我想:
preg_match_all(/[^(<\?)(\?>)]+/, $str, $match);
但结果["root", "abcd"]
相反,我愿意这样["<abcd>"]
谢谢'!
我想知道如何匹配所有标签"<?"
,"?>"
例如:
"<?root?><abcd>"
我想:
preg_match_all(/[^(<\?)(\?>)]+/, $str, $match);
但结果["root", "abcd"]
相反,我愿意这样["<abcd>"]
谢谢'!
<(?!\?).+?(?<!\?)>
这应该够了吧。
解释:
< -- 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 >
IIRC,你会这样做:
preg_match_all('/<(?!\?).+?(?<!\?)>/', $str, $match);
我当然希望这不是 HTML,但这将匹配尖括号括起来的单词,中间没有问号:
/<\w+>/
如果里面允许有其他\w
字符但没有问号:
/<[^>?]+>/
如果问号可以在里面,但只有在与尖括号相邻时才被拒绝:
/<[^?].*?[^?]>/
<b>
但是,由于最小长度限制,上述内容将具有无法匹配的副作用。
这是微不足道的,但你以错误的方式接近它。你应该匹配你想要的,而不是不匹配你不想要的。要匹配标签,请使用以下变体:
<\w+[^>\?]*>
根据您的需要使其具体化。只要\?
不在标签中允许的字符集中,就可以了。另请注意,这会将标签与属性匹配。