我需要匹配所有这些开始标记:
<p>
<a href="foo">
Run Code Online (Sandbox Code Playgroud)
但不是这些:
<br />
<hr class="foo" />
Run Code Online (Sandbox Code Playgroud)
我想出了这个,并希望确保我做对了.我只抓住了a-z.
<([a-z]+) *[^/]*?>
Run Code Online (Sandbox Code Playgroud)
我相信它说:
/,然后我有这个权利吗?更重要的是,你怎么看?
一个错误我看到人们做了,并再次试图解析XML或HTML用正则表达式.以下是解析XML和HTML很难的几个原因:
人们希望将文件视为一系列行,但这是有效的:
<tag
attr="5"
/>
Run Code Online (Sandbox Code Playgroud)
人们希望将<或<tag视为标记的开头,但是这样的东西存在于野外:
<img src="imgtag.gif" alt="<img>" />
Run Code Online (Sandbox Code Playgroud)
人们通常希望将起始标记与结束标记匹配,但XML和HTML允许标记包含自身(传统的正则表达式根本无法处理):
<span id="outer"><span id="inner">foo</span></span>
Run Code Online (Sandbox Code Playgroud)
人们通常希望匹配文档的内容(例如着名的"查找给定页面上的所有电话号码"问题),但数据可能会被标记(即使在查看时看起来是正常的):
<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>
Run Code Online (Sandbox Code Playgroud)
评论可能包含格式不正确或不完整的标记:
<a href="foo">foo</a>
<!-- FIXME:
<a href="
-->
<a href="bar">bar</a>
Run Code Online (Sandbox Code Playgroud)
你还知道其他什么问题?
我在这里使用@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)
从输出中可以看出,只删除了外部脚本标记.有什么办法可以确保删除所有脚本标记吗?
我正在尝试解析文档并获取所有图像标记并更改不同内容的来源.
$domDocument = new DOMDocument();
$domDocument->loadHTML($text);
$imageNodeList = $domDocument->getElementsByTagName('img');
foreach ($imageNodeList as $Image) {
$Image->setAttribute('src', 'lalala');
$domDocument->saveHTML($Image);
}
$text = $domDocument->saveHTML();
$ text最初看起来像这样:
<p>Hi, this is a test, here is an image<img src="http://mysite.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>
Run Code Online (Sandbox Code Playgroud)
这是输出$ text:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hi, this is a test, here is an image<img src="lalala" width="68" height="95"> Because I like Beer!</p></body></html>
Run Code Online (Sandbox Code Playgroud)
我得到了一堆我不需要的额外标签(html,正文和顶部的评论).有没有办法设置DOMDocument以避免添加这些额外的标签?
谢谢!
我对Regex不是很好,但我正在学习.
我想通过类名删除一些html标记.这是我到目前为止:
<div class="footer".*?>(.*?)</div>
Run Code Online (Sandbox Code Playgroud)
首先 .*?是因为它可能包含其他属性,第二个可能包含其他html内容.
我究竟做错了什么?我试了很多但没有成功.
在DIV内部,它可以包含多行,我正在玩Perl正则表达式.
假设我有一个包含大量文本和(x)HTML标记的字符串.我想删除给定标记的所有实例(以及该标记的任何属性),保留所有其他标记和文本.完成这项工作的最佳正则表达方式是什么?
编辑添加:哦,我很欣赏使用正则表达式来解决这个问题并不是最好的解决方案.但是,为了便于讨论,我们可以假设这个特定的技术决策比我的工资等级高出一些水平吗?;)
根据strip_tags文档,第二个参数采用允许的标记.但在我的情况下,我想反过来.假设我接受script_tags正常(默认)接受的<script>标签,但只剥离标签.有什么办法吗?
我并不是指有人为我编码,而是非常感谢如何实现这一点(如果可能的话)的可能方式的输入.
我使用富文本编辑器接受来自客户端的HTML内容的输入数据.
在服务器端,我使用基于PHP的服务器并清理传入的数据.
是否有内置的PHP功能,它保留HTML代码并删除Javascript for XSS + SQL注入代码的存在.
我现在运行的代码有这个问题。
我的代码是输入一个 URL,当我单击“提交”时,它会删除所有标签。我用strip_tags那个。然后我使用preg_match_all("/((?:\w'|\w|-)+)/", $contents, $words);它创建每个单词的数组。然后我有一个 foreach 循环,它将计算所有单词,然后将其与另一个 foreach 循环一起放入表中。
问题是例如。假设我输入一个包含以下内容的 URL:
<html>
<head>
<title>titel1</title>
</head>
<body>
<div id="div1">
<h1 class="class2">
Testpage-h1
</h1>
<p>
Testpage-p
</p>
</div>
<script>
alert('hallo');
document.getElementById('class2');
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这将使用我的代码回显以下内容:
document 1
getElementById1 1
class2' 1
hallo 1
alert 1
Testpage-h1 1
Testpage-p 1
titel1 1
Run Code Online (Sandbox Code Playgroud)
(抱歉将其作为“代码”放置,但它不允许我使用分隔符,或者将数字放在彼此下方)
我的问题是它不应该显示标签之间的内容<script></script>,因为无论如何这对我来说没有用。这个问题有解决办法吗?
我已经尝试过诸如清理过滤之类的事情,但这对我没有帮助。
我写了一个PHP脚本来获取电子邮件内容.
这些内容是HTML格式.
我想显示内容,如下所示
<?php
$email_content = '
<html>
<script>alert("XSS");</script>
<body>
<div>Line1</div>
<div>Line2</div>
</body>
</html>
';
echo $email_content;
?>
Run Code Online (Sandbox Code Playgroud)
如您所见,它将导致XSS攻击.但是如果我使用htmlspecialchars函数,它将无法显示正确的HTML格式,在这种情况下我该怎么做?谢谢.
php ×6
html ×5
regex ×4
domdocument ×2
strip-tags ×2
xss ×2
dom ×1
filter ×1
html-parsing ×1
perl ×1
sanitization ×1
script-tag ×1
string ×1
xhtml ×1
xml ×1