Php 如何使我的preg_替换仅查找不在<;首字母缩略词>;标签?

Php 如何使我的preg_替换仅查找不在<;首字母缩略词>;标签?,php,regex,preg-replace,acronym,Php,Regex,Preg Replace,Acronym,在PHP中,我有一个字符串$String和一个数组$acronyms(形式为“UK”=>“UK”) 现在我想用一些HTML标记替换$string中的所有首字母缩略词。例如,Hello UK应该变成Hello UK 我是这样做的: foreach($acronyms as $acronym => $tooltip){ $string = preg_replace('/'.$acronym.'/i', ''.$acronym.'', $string); } 问题是:假设我有一个文本Hell

在PHP中,我有一个字符串$String和一个数组$acronyms(形式为“UK”=>“UK”)

现在我想用一些HTML标记替换$string中的所有首字母缩略词。例如,
Hello UK
应该变成
Hello UK

我是这样做的:

foreach($acronyms as $acronym => $tooltip){
     $string = preg_replace('/'.$acronym.'/i', ''.$acronym.'', $string);
}
问题是:假设我有一个文本
Hello UK
,并且有一个数组将“UK”替换为“UK”,将“Kingdom”替换为“RandomWord”。然后文本将替换为
Hello UK
,这显然是混乱的

因此问题是:如何使preg\u replace只查找不在
标记中的单词?
(既不在title属性中,也不在标记本身中)

编辑:根据响应进行第二次尝试(因为我无法将代码放入响应中)。还是同样的问题,缩略词中的文本第二次被替换。。。
foreach($acronyms作为$acronym=>$tooltip){
$acronyms[$acronym]='.$acronym'.';
}

$string=str_-ireplace(数组_键($缩写)、数组_值($缩写),$string)

以下是对正则表达式版本的尝试:

foreach($acronyms as $acronym => $tooltip){
    $rexp = '/' . $acronym . '(?!((?!<acronym).)*<\/acronym>)/i';
    $string = preg_replace($rexp, ''.$acronym.'', $string);
}
foreach($acronyms作为$acronym=>$tooltip){
$rexp='/'.$acronym.(?!(?!

您可以使用
strtr()
。在执行替换后,它不会重新扫描字符串:

foreach ($acronyms as $acronym => $tooltip) {
    $acronyms[$acronym] = sprintf('<acronym title="%s">%s</acronym>',
        htmlspecialchars($tooltip),
        htmlspecialchars($acronym)
    );
}

echo strtr($str, $acronyms);
foreach($acronyms作为$acronym=>$tooltip){
$acronyms[$acronym]=sprintf(“%s”,
htmlspecialchars($tooltip),
htmlspecialchars($首字母缩写)
);
}
echo STRT($str,$缩写);

不要试图用正则表达式做任何事情:

  • 使用HTML/XML解析库解析HTML
  • 迭代HTML标记,替换必须替换的内容
  • 请您的“html解析库”将其转换回“html字符串”

  • 这就像:先去掉所有首字母缩略词,然后再添加它们。哦,通常这样的替换要么在客户端完成(根据Javascript),要么以不改变源的方式完成。然后你的问题就不会出现了。
    foreach ($acronyms as $acronym => $tooltip) {
        $acronyms[$acronym] = sprintf('<acronym title="%s">%s</acronym>',
            htmlspecialchars($tooltip),
            htmlspecialchars($acronym)
        );
    }
    
    echo strtr($str, $acronyms);