Php 如何使我的preg_替换仅查找不在<;首字母缩略词>;标签?
在PHP中,我有一个字符串$String和一个数组$acronyms(形式为“UK”=>“UK”) 现在我想用一些HTML标记替换$string中的所有首字母缩略词。例如,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
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);