2012-02-02 6 views
1

私は入力を解析するために作業しています。これはHTMLです。しかし、http://、https://、ftp://などのプロトコルを持たないhref属性やsrc属性をすべて見つけることができる必要があります。プロトコルとドメインを含む変数。だから、preg_replaceプロトコルが見つからない場合にのみhrefまたはsrc

例えば、私は

<a href="/_mylink/goes/here">Link 1</a> 
<a href="http://site.com/_myotherlink/goes/here">Link 2</a> 

を返すようにしたい:

<a href="http://mydomain.com/_mylink/goes/here">Link 1</a> 
<a href="http://site.com/_myotherlink/goes/here">Link 2</a> 

私は全体のhref属性を取得することができますが、私は場合にのみ、一致と交換する方法を動作するように見えることはできませんそれはプロトコルがありません。私が発見した[^ 0-9] /逆ではない方法で動作しますが、私は私がhttpでそれをしようとしたとき、それは仕事を得ることができなかったでしょう://など

編集:

だけそれについて言及するには、それがこの質問の「範囲」の一部であることが明らかになったので、私は{}のようなものをこれらのいくつかに使用するので、置換の結果としてURLエンコーディングを避けたい、私はそれらに%7B%7Dのようなものを持たせたくありません。

答えて

3

DOMを使用してこれらの属性を簡単に置き換えてみませんか?たとえば

+0

代わりに$ doc-> getElementsByTagName( "a")を使用し、strpos()を使用して "/"で始まるhrefをフィルタリングする類似のソリューションを作成しました。私はあなたのソリューションがxpathと一緒にこれらのタスクの両方をどのように行うのが好きです。 +1、いいね。 – IsisCode

+0

これは問題を引き起こします。自動的にurlencode()の属性が表示されているように見えますが、これはコードのその時点で回避しようとしている機能です。それをオフにする方法はありますか? –

+0

@ScottFlackこれはおそらく 'saveHTML()'のためです。代わりに 'saveXML()'を試してください。また、PHPの – Phil

2

本質的には、「ではなく」というパターンを探しています。それはnegative assertion次のようになります。

(?!http://) 

例えば/href="(?!http://)[^"]+"/のそれを追加します。

preg_replace_callbackを使用して、そこに並べ替えることができます。


「解析する」と言って以来、話題になっています。 HTMLトラバーサルの場合はまたはとなります。次に、すべてのリンクをループすることができます:

foreach (htmlqp($html)->find("a[href]") as $tag) { 
     if (!strstr($tag->attr("href"), "http://")) { 
      $tag->attr("href", "$add...."); 

明らかに、出力変換には過剰なことがあります。しかし、任意のHTMLのためのより弾力性のあるオプションかもしれません。

+0

私は本当にこのシンプルで短いのが好きですが、実際の回答よりも私とは関係があると思っていますが、それは何らかの理由で働くことができませんでした。それは私の実際のサイトのコードではなく、オンラインの 'test regex'システムの一つで動作するようになっています。 –

+0

余分なおかげで、(?!)は今でも私のコードのどこかで便利になっています。 –

関連する問題