Gantikan teks dalam rentetan dan abaikan padanan dalam teg HTML
P粉676821490
P粉676821490 2024-03-27 19:23:55
0
1
311

Untuk rentetan tertentu (biasanya perenggan), saya ingin menggantikan beberapa perkataan/frasa, tetapi abaikan mereka jika kebetulan dikelilingi oleh teg dalam beberapa cara. Ini juga perlu tidak peka huruf besar-besaran.

Ambil ini sebagai contoh:

You can find a link here <a href="#">link</a> and a lot 
of things in different styles. Public platform can appear in bold: 
<b>public platform</b>, and we also have italics here too: <i>italics</i>. 
While I like soft pillows I am picky about soft <i>pillows</i>. 
While I want to find fox, I din't want foxes to show up.
The text "shiny fruits" is in a span tag:  one of the <span>shiny fruits</span>.

Andaikata saya ingin menggantikan perkataan ini:

  • link:出现 2 次。第一个是纯文本(匹配),第二个是 A tanda(abaikan)
  • 公共平台:纯文本(匹配,不区分大小写),B kedua dalam tag (diabaikan)
  • softpillows: 1 padanan teks biasa.
  • fox: 1 padanan teks biasa. Ia melihat perkataan yang lengkap.
  • fruits:纯文本(匹配),span Tag kedua (diabaikan) dengan teks lain

Sebagai latar belakang; saya sedang mencari padanan frasa (bukan perkataan individu) dan memautkan padanan ke halaman yang berkaitan.

Saya ingin mengelakkan HTML bersarang (tebal tiada pautandalam the <a href="#">phrase <b>goes</ a> 这里</b>teg dan sebaliknya) atau ralat lain (cth:

)

Saya mencuba beberapa perkara, seperti mencari salinan teks yang telah dibersihkan yang telah dialih keluar kandungan HTML, dan sementara ini memberitahu saya ada padanan, saya menghadapi masalah baharu untuk memetakannya kembali ke kandungan asal. 🎜
P粉676821490
P粉676821490

membalas semua(1)
P粉594941301

Saya menjumpai sebutan tentang regex negative lookahead dan selepas putus asa saya mendapat regex ini (dengan andaian anda mempunyai SAH html gandingan tag)

// made function a bit ugly just to try to show how it comes together
public function replaceTextOutsideTags($sourceText = null, $toReplace = 'inner text', $dummyText = '(REPLACED TEXT HERE)')
{
  $string = $sourceText ?? "Inner text
  You can find a link here link and a lot 
  of things in different styles. Public platform can appear in bold: 
  public platform, and we also have italics here too: italics. 
  While I like soft pillows I am picky about soft pillows. 
  While I want to find fox, I din't want foxes to show up.
  The text \"shiny fruits\" is in a span tag:  one of the shiny fruits.
  The inner text like this inner inner text  here to test too, event inner text
  omg thats sad... or not
  ";
  // it would be nice to use [[:punct:]] but somehow regex thinks that  are also punctuation marks
  $punctuation = "\.,!\?:;\|\/=\"#"; // this part might take additional attention but you get the point
  $stringPart = "\b$toReplace\b";
  $excludeSequence = "(?![\w\n\s>$punctuation]*?";
  $excludeOutside = "$excludeSequence)"; // note on closing )
  $pattern = "/" . $stringPart . $excludeOutside . $excludeTag . "/im";
  
  return preg_replace($pattern, $dummyText, $string);
}

Contoh output dengan parameter lalai

"""
     (REPLACED TEXT HERE)\r\n
     You can find a link here link and a lot \r\n
     of things in different styles. Public platform can appear in bold: \r\n
     public platform, and we also have italics here too: italics. \r\n
     While I like soft pillows I am picky about soft pillows. \r\n
     While I want to find fox, I din't want foxes to show up.\r\n
     The text "shiny fruits" is in a span tag:  one of the shiny fruits.\r\n
     The (REPLACED TEXT HERE) like this inner inner text  here to test too, event (REPLACED TEXT HERE)\r\n
     omg thats sad... or not     
     """

Langkah demi langkah sekarang

  1. Tiada perlawanan seterusnya (jika hanya pillowS,我们就不需要 pillow)
  2. Jika teks diikuti oleh pembolehubah w 单词符号、s 空格或 n 换行符和 允许以开始结束标记 结尾的标点符号 - 我们不需要这个匹配,这里出现了否定的先行 (?![wns>$标点符号]*?)。在这里我们可以确定匹配不会进入新标签,因为 不在描述的序列中($excludeOutside sebarang panjang)
  3. $excludeTag 变量与 $excludeOutside 基本相同,但适用于 $toReplace 可以是 html 标签本身的情况,例如 一个
Sila ambil perhatian bahawa kod ini tidak boleh menulis ganti teks dengan > dan menggunakan simbol ini boleh menyebabkan tingkah laku yang tidak dijangka
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan