标签: domdocument

Regex/DOMDocument - 匹配和替换不在链接中的文本

我需要以不区分大小写的方式查找和替换所有文本匹配项,除非文本位于锚标记内 - 例如:

<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扩展并不熟悉,并且非常感谢这个功能的一些基本示例.

php regex xpath preg-replace domdocument

12
推荐指数
2
解决办法
6366
查看次数

DOMDocument从HTML源中删除脚本标记

在这里使用@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 xss script-tag html-parsing domdocument

12
推荐指数
2
解决办法
9593
查看次数

PHP DOMDocument:解析非转义字符串时出错

我在使用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的答案 …

html php domdocument

12
推荐指数
2
解决办法
1159
查看次数

如何使用DOMDocument类删除HTML元素

有没有办法通过使用DOMDocument类删除HTML元素?

php domdocument

11
推荐指数
2
解决办法
2万
查看次数

我如何告诉DOMDocument-> load()我想要它使用什么编码?

我从其他地方搜索和处理XML文件,并需要使用一些XSLT转换它们.没问题.使用PHP5和DOM库,一切都很简单.工作得很好,到现在为止.今天,时髦的角色在XML文件中 - 来自Word的"智能"引用,它看起来像.无论如何,DOMDocument-> load抱怨他们,说他们不是UTF-8,并指定编码.

请注意,这些XML文件中未指定编码.如果我在标题中添加'encoding ="iso-8859-1"',它可以正常工作.问题是我无法控制这些XML文件.

将文件读入字符串,修改其标题并将其写回另一个位置似乎是我唯一的选择,但我更愿意这样做,而不必使用XML文件的临时副本.有没有办法简单地告诉解析器解析它们就好像它们是iso-8859-1一样?

php xml dom domdocument

11
推荐指数
2
解决办法
2万
查看次数

如何在php中查看DOMNodeList对象的数据

当我想测试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)

我想迭代这个对象的值来测试我的查询结果?

php xpath dom domdocument

11
推荐指数
3
解决办法
3万
查看次数

php:每当我尝试编写UTF-8时都使用DomDocument,它会写入十六进制表示法

当我尝试使用DomDocument将UTF-8字符串写入XML文件时,它实际上写入字符串的十六进制表示法而不是字符串本身.

例如:

__CODE__

而不是:ירושלים

任何想法如何解决这个问题?

php utf-8 hebrew domdocument

11
推荐指数
2
解决办法
2万
查看次数

10
推荐指数
1
解决办法
4431
查看次数

正确的字符编码显示"&acirc;&#128;&#157;"?

我有一些讨厌的字符编码问题,我无法弄清楚.

基本上,我是使用PHP从网站上抓取一些HTML,然后通过PHP的DOMDocument运行它来更改一些URL等等,当它完成后,它会输出一些奇怪的东西.例如:应该有一个结束报价,它会推出&acirc;&#128;&#157;

我有charset设置的页面元标记,utf-8但随后&acirc;&#128;&#157;字符显示â€在网站上.我不确定我是不是不理解字符编码,或者是什么.

有关解决此问题的最佳方法的任何建议吗?客户端是否有元标记或某种服务器端PHP转换?

php screen-scraping utf-8 character-encoding domdocument

10
推荐指数
1
解决办法
7298
查看次数

PHP从SVG文件中获取svg标记,并在DIV中以HTML格式显示

我想读取一个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)

php svg domdocument

10
推荐指数
2
解决办法
2万
查看次数