0

誰かが私を助けることができます:

$pattern = "/^(?:[a-zA-Z0-9?. ]?)+@([a-zA-Z0-9]+)(.+)?$/";
$str = "Hey @[14256] hey how are you?";
preg_match($pattern, $title, $matches);
print_r($matches);

@メンションの括弧(@ [14256])を削除すると、印刷結果は正常に機能しますが、正規表現を実行して括弧を操作する方法がわかりません。したがって、配列で結果 14256 を取得します。

4

2 に答える 2

7

正規表現に括弧を含める必要があります。

"/^(?:[a-zA-Z0-9?. ]?)+@(\\[?[a-zA-Z0-9]+\\]?)(.+)?$/"

と追加したことに注意してください\\[?\\]?それらは[]文字に一致し、存在しない場合にも一致し[]ます。

@[14256上記はとに一致することに注意してください@14256]。どちらか一方のみを一致させたい場合は、少し異なる方法で行う必要があります。

"/^(?:[a-zA-Z0-9?. ]?)+@([a-zA-Z0-9]+|\\[[a-zA-Z0-9]+\\])(.+)?$/"

@aA1 これは、 または のいずれか に一致します@[aA1]が、上で示した悪い例には一致しません。

最後に 1 つ含めること: この正規表現は、@[mention]. そのすべてのインスタンスに一致させたい場合 (" hey @123, how is @456 these days? " など)、次のように を使用しますpreg_match_all()

"/@([a-zA-Z0-9]+|\\[[a-zA-Z0-9]+\\])/"

次に、と$matches[1]の両方が含まれます。123456

于 2012-08-18T02:09:01.387 に答える
0

新しい文字クラスとして解釈されないように、正規表現の括弧をエスケープする必要があります。代わりにこれを試してください (括弧ではなく数字のみをキャプチャします。エスケープされた括弧を括弧内に配置して、後方参照の一部としてそれらをキャプチャします):

$pattern = "/^(?:[a-zA-Z0-9?. ]?)+@\[([a-zA-Z0-9]+)\](.+)?$/";
于 2012-08-18T02:10:00.830 に答える