5

正規表現を使用して URL を検索し、それに応じてリンクしています。ただし、既にリンクされている URL をリンクしたくないので、後読みを使用して URL の前に href があるかどうかを確認しています。ただし、PHP の先読みおよび後読みでは可変長量指定子が許可されていないため、これは失敗します。

一致の正規表現は次のとおりです。

/\b(?<!href\s*=\s*[\'\"])((?:http:\/\/|www\.)\S*?)(?=\s|$)/i

この問題を回避する最善の方法は何ですか?

編集:

まだテストしていませんが、単一の正規表現でそれを行う秘訣は、PCRE でサポートされている正規表現内で条件式を使用することだと思います。次のようになります。

/(href\s*=\s*[\'\"])?(?(1)^|)((?:http:\/\/|www\.)\w[\w\d\.\/]*)(?=\s|$)/i

重要な点は、href がキャプチャされた場合、一致(?(1)^|)しないことが保証されている条件により、一致がすぐに破棄されることです。おそらく何か問題があります。明日テストします。

4

3 に答える 3

2

私は逆の方法で同じことを試みました: URL が で終わっていないことを確認して">ください:

/((?:http:\/\/|www\.)(?:[^"\s]|"[^>]|(*FAIL))*?)(?=\s|$)/i

しかし、私にとってはかなりハックに見えますが、もっとうまくやれると確信しています。

私の2番目のアプローチはあなたのものに似ています(したがって、より正確です):

/href\s*=\s*"[^"]*"(*SKIP)(*FAIL)|((?:http:\/\/|www\.)\S*?)(?=\s|$)/i

href=Iが見つかった場合(*SKIP)(*FAIL)。これは、正規表現エンジンが存在する位置にジャンプすることを意味し(*SKIP)ます。

しかし、それはそれほどハックではなく、より良い代替手段があると確信しています.

于 2010-10-15T09:24:52.087 に答える
0

私はより良い正規表現を持っていません。しかし、より良い正規表現が見つからない場合は、タスクに 2 つのクエリを使用することをお勧めします。まず、すべてのリンクを見つけて削除し、次に URL を検索します。これは、おそらくより簡単で高速です。(検索と置換を一度に行うには、次のようなものを使用できます - http://www.satya-weblog.com/2010/08/php-regex-find-and-replace-any-word-string-or- text-at-one-go.html )。

于 2010-10-15T15:46:13.330 に答える
0

「リンクの一部ではないすべての URL」を見つけることは、非常に難しい負の論理です。すべての URL を検索し、次にリンクであるすべての URL を検索し、前者のリストから後者をすべて削除する方が簡単な場合があります。

リンクの一部である URL を見つける限り、次のことを試してください

/<a([\s]+[\w="]+)*[\s]+href[\s]*=[\s]*"([\w\s:/.?+&=]+)"([\s]+[\w="]+)*>/i

念のためhttp://regexpal.com/でテストしました。最初のものを探し<a、次に任意の数のパラメータを許可し、その後にhref、その他の任意の数のパラメータを続けます。がない場合はhref、リンクではありません。<a>タグでなければ、リンクではありません。これは、(URL の) 他のリストから削除したいもののリストにすぎないため、URL の定義を に単純化しました[\w\s:/.?+&=]+。URL のリストを生成する限り、もっとスマートなものが必要になります。

于 2010-10-15T15:54:46.337 に答える