Remplacez le texte dans une chaîne et ignorez les correspondances dans les balises HTML
P粉676821490
P粉676821490 2024-03-27 19:23:55
0
1
284

Pour une chaîne donnée (généralement un paragraphe), je souhaite remplacer certains mots/phrases, mais les ignorer s'ils sont entourés de balises d'une manière ou d'une autre. Cela doit également être insensible à la casse.

Prenons ceci comme exemple :

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>.

Supposons que je veuille remplacer ces mots :

  • link:出现 2 次。第一个是纯文本(匹配),第二个是 A marquer (ignorer)
  • 公共平台:纯文本(匹配,不区分大小写),B deuxième dans la balise (ignoré)
  • softpillows : 1 correspondance en texte brut.
  • fox : 1 correspondance en texte brut. Il visualise des mots complets.
  • fruits:纯文本(匹配),span Deuxième dans la balise (ignorée) avec un autre texte

En arrière-plan ; je recherche des correspondances d'expressions (pas de mots individuels) et je relie les correspondances à des pages associées.

Je veux éviter le HTML imbriqué (gras non liensdans une the <a href="#">phrase <b>goes</ a> 这里</b>tag et vice versa) ou d'autres erreurs (par exemple :

)

J'ai essayé plusieurs choses, comme rechercher une copie nettoyée du texte dont le contenu HTML avait été supprimé, et même si cela m'indiquait qu'il y avait une correspondance, j'ai rencontré un tout nouveau problème de mappage avec le contenu original. 🎜
P粉676821490
P粉676821490

répondre à tous(1)
P粉594941301

J'ai trouvé une mention concernant regex négatif lookahead et après m'être cassé la tête, j'ai obtenu cette regex (en supposant que vous ayez VALID appariement de balises html)

// 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);
}

Exemple de sortie avec les paramètres par défaut

"""
     (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     
     """

Pas à pas maintenant

  1. Aucun match ultérieur (ne serait-ce que pillowS,我们就不需要 pillow)
  2. Si le texte est suivi d'une w 单词符号、s 空格或 n 换行符和 允许以开始结束标记 结尾的标点符号 - 我们不需要这个匹配,这里出现了否定的先行 (?![wns>$标点符号]*?)。在这里我们可以确定匹配不会进入新标签,因为 不在描述的序列中($excludeOutside variable de n'importe quelle longueur)
  3. $excludeTag 变量与 $excludeOutside 基本相同,但适用于 $toReplace 可以是 html 标签本身的情况,例如 一个
Veuillez noter que ce code ne peut pas écraser le texte avec > et que l'utilisation de ces symboles peut provoquer un comportement inattendu
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!