Php 正则表达式替换HTML中但不在链接或标题中的字符串
我正在寻找一个正则表达式来替换html页面中的给定字符串,但前提是该字符串不是标记本身的一部分,或者在链接或标题中显示为文本 示例: 寻找“替换我”Php 正则表达式替换HTML中但不在链接或标题中的字符串,php,html,regex,Php,Html,Regex,我正在寻找一个正则表达式来替换html页面中的给定字符串,但前提是该字符串不是标记本身的一部分,或者在链接或标题中显示为文本 示例: 寻找“替换我” 你可以很好地替换我好的 没有对手 替换我 没有对手 不匹配 replace_me第一个不匹配,第二个确定,第三个不匹配 提前谢谢 更新: 我找到了一个有效的正则表达式 \b(replace_me)\b(?!(?:(?!<\/?[ha].*?>).)*<\/[ha].*?>)(?![^<>]*>) \b(
你可以很好地替换我
好的
没有对手
替换我
没有对手
不匹配
replace_me
第一个不匹配,第二个确定,第三个不匹配
提前谢谢
更新:
我找到了一个有效的正则表达式
\b(replace_me)\b(?!(?:(?!<\/?[ha].*?>).)*<\/[ha].*?>)(?![^<>]*>)
\b(替换我)\b(?!(?:(!))*)(?![^]*>)
是个会让你发疯的坏主意。在这方面使用regex可能没有那么糟糕,但无论采用何种方法,都需要考虑以下几点:
一页中有多少个
您将对多少页执行此操作
您是手动检查输出,还是自动检查
您使用哪种编程语言进行此操作
我认为最好的方法不是使用一个“简单”(读起来:非常复杂)的正则表达式,而是一个有一些逻辑支持的适当程序——当然,除非正则表达式是图灵完备的,其他人可以提供一个正则表达式来做你想做的事情:)\b(replace_me)\b(?!(:(!)*(![^]*>)
我有一个类似的问题-给定一个HTML字符串,我想用tio2
替换字符串tio2
的所有实例,用ticl4
替换ticl4
这很容易通过简单的字符串替换来实现,但在某些情况下,“针”字符串出现在域名中,例如www.ilovetio2.com
,www.tastytastycl4.info
。在这些情况下,href属性将被字符串替换破坏
我选择在HTML字符串上进行两次传递,而不是在试图找到一个单一的、复杂的正则表达式时乱来:
- 将所有实例替换为
str\u ireplace
- 找到任何包含
…
的href属性,并修复它们preg\u replace\u callback
public static function subscriptStrings($str)
{
// $str is arbitrary string which may be HTML, may be plain text
// Define search / replacements
$map = [
'tio2' => 'TiO<sub>2</sub>',
'ticl4' => 'TiCl<sub>4</sub>'
];
// Replace ALL instances, paying no heed to their context
$str = str_ireplace(array_keys($map), array_values($map), $str);
// Make a second pass, specifically looking for href values
$str = preg_replace_callback('/href="[^"]+"/', function ($str) {
// Return the href value stripped of <sub> tags
return str_replace(['<sub>', '</sub>'], '', $str[0]);
}, $str);
return $str;
}
公共静态函数subscriptStrings($str)
{
//$str是任意字符串,可以是HTML,也可以是纯文本
//定义搜索/替换
$map=[
“tio2”=>“tio2”,
‘ticl4’=>‘ticl4’
];
//替换所有实例,不考虑它们的上下文
$str=str\u ireplace(数组\u键($map)、数组\u值($map)、$str);
//进行第二次检查,特别是查找href值
$str=preg_replace_回调('/href=“[^”]+“/”,函数($str){
//返回除去标记的href值
返回str_replace(['','','','$str[0]);
}美元/平方米);
返回$str;
}
这不是防弹的,如果出于某种原因,所讨论的链接中应该有某种原因,那么它将失败。在regex中这样做会很痛苦,但是:(i)什么语言?(ii)你会考虑使用HTML解析器吗?另外,我认为这可能是在XSLT的范围内。HTML解析器也不会使用正则表达式ES吗?不,它不是。它按字符解析HTML字符并将所有相关的部分存储在树状数据结构中。1。可以有更多的一个2和3。自动化4。PHP之一可能是第一个解决方案。替换标签之间的所有链接和标题,然后执行正则表达式忽略这些标签中的内容?@Alphax你只是个懦夫。如果你不想使用正则表达式,我没问题,但不要指望其他人不使用它
public static function subscriptStrings($str)
{
// $str is arbitrary string which may be HTML, may be plain text
// Define search / replacements
$map = [
'tio2' => 'TiO<sub>2</sub>',
'ticl4' => 'TiCl<sub>4</sub>'
];
// Replace ALL instances, paying no heed to their context
$str = str_ireplace(array_keys($map), array_values($map), $str);
// Make a second pass, specifically looking for href values
$str = preg_replace_callback('/href="[^"]+"/', function ($str) {
// Return the href value stripped of <sub> tags
return str_replace(['<sub>', '</sub>'], '', $str[0]);
}, $str);
return $str;
}