Maison  >  Questions et réponses  >  le corps du texte

Remplacez le texte dans une chaîne et ignorez les correspondances dans les balises HTML

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 :

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粉676821490P粉676821490229 Il y a quelques jours285

répondre à tous(1)je répondrai

  • P粉594941301

    P粉5949413012024-03-28 12:56:47

    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 < and > 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 )
      $excludeTag = "$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

    répondre
    0
  • Annulerrépondre