Maison > Questions et réponses > le corps du texte
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粉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
pillowS
,我们就不需要 pillow
)w
单词符号、s
空格或 n
换行符和 允许以开始结束标记
结尾的标点符号 - 我们不需要这个匹配,这里出现了否定的先行 (?![wns>$标点符号]*?)
。在这里我们可以确定匹配不会进入新标签,因为 <
不在描述的序列中($excludeOutside
variable de n'importe quelle longueur)$excludeTag
变量与 $excludeOutside
基本相同,但适用于 $toReplace
可以是 html 标签本身的情况,例如 一个
<
或 >
et que l'utilisation de ces symboles peut provoquer un comportement inattendu