1

ファイル共有サイトへのリンクを除外する vBulletin のプラグインをまとめようとしています。しかし、よく耳にするように、私は正規表現はおろか、php の初心者でもあります。

基本的に、正規表現をまとめて preg_replace を使用して、これらのドメインからの URL を見つけ、リンク全体を許可されていないというメッセージに置き換えようとしています。ハイパーリンクされているか、プレーンテキストとして投稿されているか、[CODE] bb タグで囲まれているかに関係なく、リンクを見つけてほしいと思います。

正規表現に関しては、次の URL を見つけるために必要になると思います。

  1. http またはアンカータグで始まります。[CODE] タグ内の URL は、プレーン テキストの URL と同じように処理できると思います。その後、置換が [CODE] タグ内で終了しても問題ありません。
  2. ドメイン/単語の前に任意の数の任意の文字を含めることができます
  3. 中間のどこかにドメインがあります
  4. ドメインの後に任意の数の任意の文字を含めることができます
  5. (html|htm|rar|zip|001) などのいくつかの拡張子または終了アンカー タグで終了します。

私をつまずかせているのは2番と4番だと感じています(それ以上ではないにしても)。here で同様の質問を見つけて、コードを少し分解しようとしました(実際には理解していませんでしたが)。私は今、うまくいくかもしれないと思っていたこれを持っていますが、うまくいきません:

<?php  
$filterthese = array('domain1', 'domain2', 'domain3');  
$replacement = 'LINKS HAVE BEEN FILTERED MESSAGE';  
$regex = array('!^http+([a-z0-9-]+\.)*$filterthese+([a-z0-9-]+\.)*(html|htm|rar|zip|001)$!',  
'!^<a+([a-z0-9-]+\.)*$filterthese+([a-z0-9-]+\.)*</a>$!');
$this->post['message'] = preg_replace($regex, $replacement, $this->post['message']);
?>  

私はここでベースから外れていると感じており、正規表現はおろか、php も完全には理解していないことを認めます。これをより良く行う方法、機能させる方法、または RTM へのリンクに関する提案をお待ちしています (ただし、少し読んだので続けます)。

ありがとう。

4

3 に答える 3

1

URLで使用parse_urlして、返されるハッシュマップを調べることができます。これにより、ドメインまたはさらにきめ細かい制御をフィルタリングできます。

于 2009-12-09T10:24:12.590 に答える
1

filter_var組み込み関数を使用すると、このオーバーヘッドを回避できると思います。

PHP 5.2.0以降、この機能を使用できます。

$good_url = filter_var( filter_var( $raw_url, FILTER_SANITIZE_URL), FILTER_VALIDATE_URL);
于 2009-12-09T10:24:35.507 に答える
0

うーん、私の最初の推測:あなた$filtertheseは一重引用符で囲まれた文字列の中に直接入れます。その一重引用符では、変数の置換はできません。また、$filtertheseは配列であり、最初に結合する必要があります。

var $filterthese = implode("|", $filterthese);

vBulletinプラグインとその埋め込みマジックについて何も知らないので、多分私は遠いですが、その点は私にはチェックする価値があるようです。

編集: OK、提供されたソースを再確認すると、正規表現の行は次のようになります。

$regex = '!(?#
  possible "a" tag [start]: )(<a[^>]+href=["\']?)?(?#
  offending link:           )https?://(?#
    possible subdomains:    )(([a-z0-9-]+\.)*\.)?(?#
    domains to block:       )('.implode("|", $filterthese).')(?#
    possible path:          )(/[^ "\'>]*)?(?#
  possible "a" tag [end]:   )(["\']?[^>]*>)?!';
于 2009-12-09T10:21:00.783 に答える