TextismTextileのPHPコードで次の正規表現を見つけました。
/\b ?[([]TM[])]/i
私は自分自身が正規表現を読んだ経験があると思いますが、これは私には謎です。最初は簡単ですが、すでに開いている文字クラスの中に2つの空の文字クラスがある理由がわかりません[[][]]
。
誰かがこの問題に光を当てることができますか?
それはかなり不可解なものです...
意味は次のとおりです。
/ # start regex pattern
\b # word boundary
? # an optional space
[([] # char class: either '(' or '['
TM # literal 'TM'
[])] # char class: either ']' or ')'
/ # end regex pattern
i # match case insensitive
注意すべき点:
[
は、特別ではなく、エスケープする必要はありません([([]
したがって有効です!)[])]
したがって、有効です:]
エスケープする必要はありません!)要約すると、 orとor"TM"
のいずれかで囲まれた大文字と小文字を区別しないものと一致します(一致する必要はありません。ほとんどの場合、一致します)。ほとんどの場合、前に一致しないものが続くため、以下のデモの一致から除外されるためです。[
(
]
)
"[TM)"
\b ?
"[tm)"
". "
\b ?
<?php
preg_match_all(
'/\b ?[([]TM[])]/i',
"... [tm) foo (TM) bar [TM] baz (tm] ...",
$matches
);
print_r($matches);
?>
/*
Array
(
[0] => Array
(
[0] => (TM)
[1] => [TM]
[2] => (tm]
)
)
*/
編集:]
正規表現が正規表現のPOSIXフレーバーに従っている場合、文字クラスの最初の文字として許可されているようです。http://www.regular-expressions.info/posixbrackets.htmlを参照してください。PHPでは、eregs_
関数はPOSIXを使用しますが、preg_
関数はこの構成を許可しない新しいPCREフレーバーを使用します。
したがって、POSIXフレーバーを提供しました。
[([]
(と[および
[])]
]と)で構成されるもう1つのものです。ほとんどの正規表現エンジンでは、2番目の文字クラスを記述する必要があります
[\])]
代わりは。