我需要以不区分大小写的方式查找和替换所有文本匹配项,除非文本位于锚标记内 - 例如:
<p>Match this text and replace it</p>
<p>Don't <a href="/">match this text</a></p>
<p>We still need to match this text and replace it</p>
Run Code Online (Sandbox Code Playgroud)
搜索"匹配此文本"只会替换第一个实例和最后一个实例.
[编辑]根据戈登的评论,在这个例子中可能更喜欢使用DOMDocument.我对DOMDocument扩展并不熟悉,并且非常感谢这个功能的一些基本示例.
我在这里使用@Alex的方法使用内置的DOMDocument从HTML文档中删除脚本标记.问题是,如果我有一个带有Javascript内容的脚本标记,然后是另一个链接到外部Javascript源文件的脚本标记,则不会从HTML中删除所有脚本标记.
$result = '
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
alert("hello");
</script>
</head>
<body>hey</body>
</html>
';
$dom = new DOMDocument();
if($dom->loadHTML($result))
{
$script_tags = $dom->getElementsByTagName('script');
$length = $script_tags->length;
for ($i = 0; $i < $length; $i++) {
if(is_object($script_tags->item($i)->parentNode)) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
}
echo $dom->saveHTML();
}
Run Code Online (Sandbox Code Playgroud)
以上代码输出:
<html>
<head>
<meta charset="utf-8">
<title>hey</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
从输出中可以看出,只删除了外部脚本标记.有什么办法可以确保删除所有脚本标记吗?
我在使用PHP的DOMDocument解析HTML时遇到了问题.
我正在解析的HMTL具有以下脚本标记:
<script type="text/javascript">
var showShareBarUI_params_e81 =
{
buttonWithCountTemplate: '<div class="sBtnWrap"><a href="#" onclick="$onClick"><div class="sBtn">$text<img src="$iconImg" /></div><div class="sCountBox">$count</div></a></div>',
}
</script>
Run Code Online (Sandbox Code Playgroud)
这个片段有两个问题:
1)buttonWithCountTemplatevar中的HTML 不会被转义.DOMDocument正确地管理它,在解析时转义字符.不是问题.
2)接近结尾,有一个img标签带有未转义的结束标签:
<img src="$iconImg" />
Run Code Online (Sandbox Code Playgroud)
该/>品牌的DOMDocument认为脚本执行完毕,但它缺少结束标记.如果使用getElementByTagName提取脚本,则会在此img标记处关闭标记,其余的将在HTML上显示为文本.
我的目标是删除此页面中的所有脚本,因此如果我执行removeChild()此标记,则会删除标记,但在呈现页面时,以下部分将显示为文本:
</div><div class="sCountBox">$count</div></a></div>',
}
</script>
Run Code Online (Sandbox Code Playgroud)
修复HTML不是一个解决方案,因为我正在开发一个通用的解析器,需要处理所有类型的HTML.
我的问题是,在将HTML提供给DOMDocument之前是否应该进行任何清理,或者是否有选项可以在DOMDocument上启用以避免触发此问题,或者即使我可以在加载HTML之前删除所有标记.
有任何想法吗?
经过一些研究,我发现了DOMDocument解析器的真正问题.请考虑以下HTML:
<div> <!-- Offending div without closing tag -->
<script type="text/javascript">
var test = '</div>';
// I should not appear on the result
</script>
Run Code Online (Sandbox Code Playgroud)
使用以下php代码删除脚本标记(基于Gholizadeh的答案 …
我从其他地方搜索和处理XML文件,并需要使用一些XSLT转换它们.没问题.使用PHP5和DOM库,一切都很简单.工作得很好,到现在为止.今天,时髦的角色在XML文件中 - 来自Word的"智能"引用,它看起来像.无论如何,DOMDocument-> load抱怨他们,说他们不是UTF-8,并指定编码.
请注意,这些XML文件中未指定编码.如果我在标题中添加'encoding ="iso-8859-1"',它可以正常工作.问题是我无法控制这些XML文件.
将文件读入字符串,修改其标题并将其写回另一个位置似乎是我唯一的选择,但我更愿意这样做,而不必使用XML文件的临时副本.有没有办法简单地告诉解析器解析它们就好像它们是iso-8859-1一样?
当我想测试php数组时,我使用以下代码
print_r($myarray);
Run Code Online (Sandbox Code Playgroud)
但我知道我想看到对象的数据
$xpath = new DOMXPath($doc);
$myobject = $xpath->query('//*[ancestor-or-self::a]');
Run Code Online (Sandbox Code Playgroud)
我用的时候
print_r($myobject);
Run Code Online (Sandbox Code Playgroud)
我得到了那个输出
DOMNodeList Object ( )
Run Code Online (Sandbox Code Playgroud)
我想迭代这个对象的值来测试我的查询结果?
当我尝试使用DomDocument将UTF-8字符串写入XML文件时,它实际上写入字符串的十六进制表示法而不是字符串本身.
例如:
__CODE__
而不是:ירושלים
任何想法如何解决这个问题?
我有一些讨厌的字符编码问题,我无法弄清楚.
基本上,我是使用PHP从网站上抓取一些HTML,然后通过PHP的DOMDocument运行它来更改一些URL等等,当它完成后,它会输出一些奇怪的东西.例如:应该有一个结束报价,它会推出”
我有charset设置的页面元标记,utf-8但随后”字符显示â€在网站上.我不确定我是不是不理解字符编码,或者是什么.
有关解决此问题的最佳方法的任何建议吗?客户端是否有元标记或某种服务器端PHP转换?
我想读取一个SVG文件并从该文件中获取SVG标记(因为我想在html中显示svg,例如<div><svg>...</svg></div>没有xml标题).
并在浏览器中显示此svg标签,如HTML - 打印此SVG标签,如SVG图像.贝塞尔现在我输错了输出" DOMNodeList Object([length] => 1) ".
PHP
$doc = new DOMDocument();
$doc->load('http://example.com/logo.svg');
$svg = $doc->getElementsByTagName('svg');
echo "<div style='width: 100%, height: 100%; '>";
print_r($svg); // DOMNodeList Object ( [length] => 1 )
echo "</div>";
Run Code Online (Sandbox Code Playgroud) domdocument ×10
php ×10
dom ×3
html ×2
utf-8 ×2
xpath ×2
hebrew ×1
html-parsing ×1
html5 ×1
preg-replace ×1
regex ×1
script-tag ×1
svg ×1
xml ×1
xss ×1