すべてのタグをどのように一致させるかを知りたいのですが"<?"
、"?>"
例:
"<?root?><abcd>"
私は思った:
preg_match_all(/[^(<\?)(\?>)]+/, $str, $match);
しかし、rsultは["root", "abcd"]
代わりに私はそうなりたいと思っていました["<abcd>"]
ありがとう'!
すべてのタグをどのように一致させるかを知りたいのですが"<?"
、"?>"
例:
"<?root?><abcd>"
私は思った:
preg_match_all(/[^(<\?)(\?>)]+/, $str, $match);
しかし、rsultは["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+[^>\?]*>
必要に応じて具体的にします。タグで許可されている文字のセットに含まれていない限り、\?
問題はありません。また、これは属性を持つタグと一致することに注意してください。