文字列内のテキストを置換し、HTML タグ内の一致を無視します
P粉676821490
P粉676821490 2024-03-27 19:23:55
0
1
255

指定された文字列 (通常は段落) について、いくつかの単語/フレーズを置換したいのですが、何らかの方法でタグで囲まれている場合は無視してください。これも大文字と小文字を区別しない必要があります。

例:

リーリー

次の単語を置き換えるとします:

  • リンク: 2 回表示されます。 1 つ目はプレーン テキスト (一致)、2 つ目は A タグ (無視)
  • パブリック プラットフォーム: プレーン テキスト (一致、大文字と小文字を区別しない)、B タグの 2 番目 (無視)
  • softpillows: 1 件のプレーン テキスト一致。
  • fox: 1 件のプレーン テキスト一致。完全な単語を表示します。
  • fruits: プレーン テキスト (一致)、span タグの 2 番目 (無視) と他のテキスト

背景として、(個々の単語ではなく) 一致するフレーズを検索し、一致したものを関連ページにリンクしています。

ネストされた HTML (リンク のない 太字の タグ、またはその逆) やその他のエラー (例: the <a href="# ">フレーズ <b>ここに</ a>が入ります</b>)

HTML コンテンツが削除されたテキストのサニタイズされたコピーを検索するなど、いくつかのことを試しました。一致があることがわかりましたが、それを元のテキストにマッピングし直すというまったく新しい問題に遭遇しました。コンテンツ。

P粉676821490
P粉676821490

全員に返信(1)
P粉594941301

regex の否定先読み についての言及を見つけましたが、考えがまとまらなかった後、この正規表現を入手しました (VALID HTML タグがペアになっていると仮定します)

リーリー

デフォルトパラメータを使用した出力例

リーリー

これからステップバイステップです

  1. 後続の一致はありません (pillowS のみがある場合は、pillow は必要ありません)
  2. テキストの後に任意の長さの \w 単語記号、\s スペース、または \n 改行と を使用して終了することができます。開始タグ付き 終了句読点 - この一致は必要ありません。否定的な先読みがあります (?![\w\n\s>$Punctuation]*? 。ここで、 が記述されたシーケンス ($excludeOutside 変数) にないため、一致が新しいタグに含まれないことがわかります (
  3. $excludeOutside
  4. 変数) $excludeTag 変数は基本的に $excludeOutside と同じですが、# など、$toReplace が HTML タグ自体になる場合に適用されます。 ##a
このコードではテキストを または >>
で上書きできず、これらの記号を使用すると予期しない動作が発生する可能性があることに注意してください。
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!