2016-11-23 56 views
1

在一个php文件中,我想找到所有回显某些内容的行,但是echo不包含任何HTML。这样做的目的是做一个搜索替换来实现XSS保护。php正则表达式负向lookahead查找任何地方

我的测试字符串看起来是这样的:

<?php foreach($this->userlist as $u) { ?> 
     <option value="<?php echo '<h1>'.$u['user_id'];?>" <?php echo $this->wfe->job['created_by']==$u['user_id']?'selected':'';?>><?php echo $u['real_name'];?></option> 
<?php }; ?> 

我经常“基地”表达的是:

<\?php\secho\s(.*?)\?> 

我已经然后试图插入我的比赛一号内的各种负先行表达式:

(?!('<)) - excludes my '<h1>' tag echo successfully 

(?!(\$)) - excludes my other echo statements 

但是

(?!^.*<[^>]+.*) - does not exclude any of my echo statements 
(?!.*<[^>]+.*) - excludes all of my echo statements 

我该如何排除我的echo声明包括?

我已经记录了正则表达式在这里:https://regex101.com/r/hDufvl/2

+1

“搜索替换来实现XSS保护”我几乎可以保证任何搜索和替换解决方案的XSS攻击都不会完成。 – Chris

+0

@Chris谢谢,但它会降低风险。这将结合手动审查,一旦自动搜索/替换完成 – jdog

回答

0
/<\?php\s+echo\b(?:.(?!<[a-z]))*?\?>/gsi 

https://regex101.com/r/hDufvl/5

我想这可能给你覆盖的错觉。没有任何内容会取代适当的评论

+0

我实际上已经找到了更好的方式来处理XSS,但热衷于了解我做错了什么 – jdog