0

私はニュースレター アプリを作成しています。クライアントのニュースレターに表示される可能性のあるユーザー定義のリンクを次のように変更して、検出されたリンクが次のようになるようにする必要があります。

<a href="http://whateverclientsite.com/">blah</a>

になる

<a href="http://mysite.com/redirect.php?utm_source=Emails&utm_medium=MyNewsletterSubject&utm_campaign=MyNewsletterCampaign&eid=123123&mailid=234234&url=http://whateverclientsite.com/>blah</a>

私の redirect.php は、起動するいくつかの Google アナリティクス コードを含むページになり (そのため、ニュースレターが生成するリンク クリックの数を追跡できます)、ユーザーが定義した URL http://whateverclientsite.comにリダイレクトされます。

ニュースレターが送信される前に変更を行う必要があるため、このリンクの書き換えはクライアント側の JavaScript ではなく php で行う必要があります。

私がここで探しているのは、URL の書き換えを行うコード、つまり私が既に作業している Google のものです。かなり単純な正規表現操作のはずですが、私の正規表現スキルは最低です。

回答が得られる前に動作するようになったら、投稿します。

PS: また、書き換えられないように、特定の URL とイメージ タグを取り除く必要があります。たとえば、mysite.com へのリンクは書き換えるべきではありません。

PSニュースレター全体は、処理する必要がある時点でphp文字列として存在します。私
$newsletter = rewriteurls($newsletter, $url_exceptions_array);
が考えている関数呼び出しはそうです-私の質問は、rewriteurls()をどのように定義すればよいですか?

4

1 に答える 1

1

URL 形成規則は非常に複雑です ( rfc )。また、html 属性も複雑です。ただし、リコールのトレードオフを気にしない場合は、次のとおりです。

$new_url = preg_replace(
    '@href=(?:\'|")?(?P<url>[\w?&=+/%#.:-]*)(?:\'|")?@i', 
    'href="redirect.php?u=$1"', # replace this with desired wrapper
    $your_feed);

この関数は、間違ったスキーム ( などabbbc://this.is.invalid.url)、間違ったタグ ( <link href=...)、スペース ( href =) で失敗しますが、これらのケースに遭遇する可能性はあまりありません。もしそうなら、この正規表現を改善して、欠けているものをカバーしてください。

この正規表現が構成されているものを見てみましょう (以下は提示されているため使用できません)。

@ <-- delimiter
  href=(?:\'|")? <-- href=' or href=" or href=
  (?P<url> <-- capturing part
    [\w?&=+/%#.:-]* <-- a-zA-Z0-9_?/=+%#.:-& from zero to infinity times
  )
  (?:\'|")? <-- close href value
@i <-- delimiter, case insensetive modifier. HREF will work too
于 2012-06-20T18:18:01.413 に答える