0

テキスト ブロック内のキーワードに一致する正規表現を作成しようとしています。これらのキーワードにはリンクが追加されます。すでにリンク内にあるキーワードは一致しません。

90% の道のりをたどった投稿を見つけました - HTML タグ <a> の外側のキーワードに一致する PHP 正規表現

ただし、このソリューションでは、img alt 属性内の任意のキーワードが一致し、img タグが壊れます。alt 属性内のキーワードを許可しないように正規表現を修正する方法はありますか?

これが私が今持っている正規表現です(PHPで):

$content = preg_replace(' ~'.$keyword.'(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)~i', '<a href="'.$url.'">$0</a>', $content);

私はキーワード/ URLの配列を持っています。

'consectetur' => '/path/to/consectetur'

したがって、次のテキストがあるとします。

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

キーワード「consectetur」は次のように置き換えます。

<a href="/path/to/consectetur">consectetur</a>

ただし、ここに表示される場合はそうではありません:

<img src="..." alt="consectetur adipisicing elit">

またはここ:

<a href="">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</a>
4

1 に答える 1

2

検索語の後に別の先読みを追加することによって? これは非常に複雑なパターンですが、うまくいくようです:

Word(?![^<]*?>)(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)

説明:

Word
(?!         # that is not followed by
[^<]*       # zero or more of anything anything that is not <
?>          # lazily up to >
)           # end lookahead

では<span class="Word">、先読みのために[^<]*?>一致">し、失敗します。

<a href="/Word" alt="Word">[^<]*?>一致" alt="Word">して失敗します。

式のこの部分については、説明するのは所属するスレッドの投稿者に任せます。これは、その中のいくつかの要素について完全には確信が持てないためです。

(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)
于 2013-07-05T16:23:29.467 に答える