2

私はここで多くの質問(およびさらに多くのウェブサイト)を見て、いくつかはヒントを提供しましたが、どれも私に決定的な答えを与えませんでした。私は正規表現を知っていますが、教祖にはほど遠いです。この特定の質問は、PHPの正規表現を扱います。

特定のクラスのハイパーリンクで囲まれていないテキスト内の単語を見つける必要があります。たとえば、私は持っているかもしれません

This <a href="blabblah" class="no_check">elephant</a> is green and this elephant is blue while this <a href="blahblah">elephant</a> is red.

2番目と3番目の象と照合する必要がありますが、最初の象とは照合する必要はありません(テストクラス「no_check」で識別されます)。ハイパーリンク内には、hrefやclass以外の属性が存在する可能性があることに注意してください。私は思いついた

((?<!<a .*class="no_check".*>)\belephant\b)

これは正規表現テストソフトウェアでは美しく機能しますが、PHPでは機能しません。

どんな助けでも大歓迎です。正規表現を提供できないが、その必要性を回避するようなPHPコードロジックを見つけることができれば、私も同様に感謝します。

4

3 に答える 3

1

可変幅の負の先読みが利用できない場合、迅速で汚い解決策は、メモリ内の文字列を逆にして、代わりに可変幅の負の先読みを使用することです。その後、もう一度文字列を逆にします。

ただし、HTMLパーサーを使用した方がよい場合があります。

于 2010-04-27T21:50:44.113 に答える
1

最も簡単なアプローチは、「no_check」属性を持つ完全な要素、または検索している単語のいずれかと一致させることだと思います。例えば:<a>

<a [^<>]*class="no_check"[^<>]*>.*?</a>|(\belephant\b)

一致した単語の場合、キャプチャグループ#1に含まれます。そうでない場合、そのグループは空またはnullである必要があります。

もちろん、「最も単純なアプローチ」とは、実際には最も単純な正規表現アプローチを意味します。さらに簡単なのは、HTMLパーサーを使用することです。

于 2010-04-27T23:35:09.663 に答える
1

結局、混合溶液を使用しました。特定のキーワードのテキストを解析し、それらがすでにリンクの一部であるかどうかを確認し、そうでない場合はハイパーリンクに追加する必要があることがわかりました。ここで提供されるソリューションは非常に興味深いものでしたが、私が必要とするものに合わせて正確に調整されていませんでした。

HTMLパーサーを使用するというアイデアは良いものでしたが、私は現在、別のプロジェクトでHTMLパーサーを使用しています。そのため、その解決策を提案してくれたAlanMooreとEricStromの両方に敬意を表します。

于 2010-05-06T15:53:28.750 に答える