正则替换危险字符的方法

本文介绍了一个用于清除HTML中潜在危险代码的PHP函数。该函数通过正则表达式匹配并移除脚本、iframe、表单及事件触发等恶意代码,确保网站安全。
[code]   /**
     * 对于危险字符串的替换
     * @author ShopNC Develop Team
     * @param  $value string
     * @return string
     */
        function dangerousCode($value){
                $patterns = array(
                "/<script.*>.*<\/script>/siU",
                "/<iframe.*>.*<\/iframe>/siU",
                "/<input(.*submit.*)>/siUe",
                "/<form(.*action.*)>/siUe",
                '/on(mousewheel|mouseover|click|load|onload|submit|focus|blur)="[^"]*"/i'
                );
                $replacements = array('','','','','');
                return preg_replace($patterns, $replacements, $value);
        }[/code]

转载于:https://www.cnblogs.com/goody9807/archive/2008/08/29/1279517.html

<think> 我们正在讨论如何使用正则表达式排除特殊字符,特别是中文特殊字符。根据用户上一次的问题和我的回答,用户希望了解如何构建正则表达式来过滤掉不需要的特殊字符,尤其是中文环境下的标点符号等。 回顾之前的回答,我们主要使用了排除型字符组(negated character class)即 [^...] 的形式,来匹配除了我们允许的字符以外的所有字符,并将其替换为空字符串。 现在,用户的问题同样是关于“排除特殊字符”,我们可以进一步细化,提供更具体的正则表达式方法。 根据引用[5],我们看到一个例子: String regEx="[\\u00A0\\s\"`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“'。,、?]"; 这个正则表达式定义了一个字符组,里面包含了很多特殊字符(包括空格、标点符号等),用来匹配这些字符并删除它们。 但是,用户可能希望排除的字符可能包括中文特殊字符(如中文标点),也可能包括英文特殊字符。因此,我们可以提供以下几种方法方法一:直接列出要排除的特殊字符 将需要排除的所有特殊字符放入一个字符组中,然后使用replaceAll方法替换为空字符串。 方法二:使用排除型字符组,只保留允许的字符(比如汉字、字母、数字、空格等),将不允许的都删除。 方法三:结合Unicode属性,例如使用\p{P}来匹配所有标点符号(包括中文和英文),然后排除它们。但是注意,Java正则表达式支持\p{P},它匹配任何语言的标点符号,但可能也包括一些我们不需要排除的符号(如下划线等可能不属于标点,但也要根据具体情况)。 然而,需要注意的是,引用[3]提到排除特定字符串的困难,但我们这里排除的是单个字符,所以使用字符组排除是可行的。 下面我们具体展开: 1. 方法一:列出要排除的特殊字符(适用于特殊字符明确且不多的情况) 例如,我们要排除中英文的标点符号,可以这样写: String regex = "[,,.。!!??;;::\"“”'‘’()()\\[\\]【】{}{}<>《》]"; 然后使用:str.replaceAll(regex, ""); 2. 方法二:使用排除型字符组,即保留我们想要的字符,其他都删除。 例如,我们只保留汉字、字母、数字和空格: String regex = "[^\\u4e00-\\u9fa5a-zA-Z0-9\\s]"; 这样,除了汉字、大小写字母、数字和空白字符(空格、制表符、换行符等)之外的所有字符都会被删除。 3. 方法三:使用Unicode属性类(更通用,但需要了解Unicode属性) 例如,排除所有标点符号(包括中文和英文): String regex = "\\p{P}"; String result = str.replaceAll(regex, ""); 注意:\p{P} 会匹配任何语言的标点符号,包括中文的句号、逗号,英文的句号、逗号等。但是,它可能不会匹配一些特殊符号(如@、#、$等),因为那些属于符号类\p{S}。所以,如果我们想排除所有标点符号和符号,可以: String regex = "[\\p{P}\\p{S}]"; 另外,\p{P}和\p{S}都是Unicode属性,具体可以参考Java正则表达式的Unicode支持。 根据用户的需求,如果用户想要排除中文特殊字符,我们可能需要结合中文标点的具体范围。但是,由于中文标点分散在Unicode的不同区域,使用\p{P}可能更方便。 然而,引用[5]中的例子就是直接列出特殊字符,这种方法虽然长,但是精确。我们可以根据需求选择。 下面给出一个示例,排除中英文标点符号以及其他特殊符号(如@、#等): String regex = "[\\p{P}\\p{S}\\s&&[^ ]]"; 这里\p{P}是标点,\p{S}是符号,\s是空白字符,但是我们可能想保留空格,所以需要排除空格?但是这样写复杂了。 实际上,如果我们想保留字母、数字、汉字和空格,那么还是使用方法二更直接。 因此,我推荐使用方法二,因为它更清晰,且容易调整允许的字符范围。 示例代码: ```java public class RemoveSpecialChars { public static void main(String[] args) { String input = "Hello, 世界!欢迎来到Java编程。电话:123-4567。"; // 方法二:只保留汉字、字母、数字和空格 String regex = "[^\\u4e00-\\u9fa5a-zA-Z0-9\\s]"; String result = input.replaceAll(regex, ""); System.out.println(result); // 输出:Hello 世界欢迎来到Java编程电话1234567 } } ``` 注意:上面的正则表达式中,我们排除了所有非汉字、非字母、非数字、非空格的字符。连字符(-)被删除了,因为不在允许的范围内。如果我们想保留连字符,可以将其加入: String regex = "[^\\u4e00-\\u9fa5a-zA-Z0-9\\s-]"; 另外,如果我们还想保留下划线,那么可以加入下划线: String regex = "[^\\u4e00-\\u9fa5a-zA-Z0-9\\s_-]"; 所以,方法二的灵活性在于我们可以自由添加需要保留的字符方法三的示例(使用Unicode属性排除所有标点和符号,但保留空格和字母数字等): String regex = "[\\p{P}\\p{S}]"; String result = input.replaceAll(regex, ""); // 输入:Hello, 世界!欢迎来到Java编程。电话:123-4567。 // 输出:Hello 世界欢迎来到Java编程电话1234567 (注意:连字符也被删除了,因为连字符属于标点符号?实际上连字符在Unicode中属于Punctuation Dash (Pd)类别,会被\p{P}匹配。而@、#等属于符号\p{S}) 但是,方法三会删除所有标点和符号,如果我们想保留一些符号(比如数学符号+、=等),那么方法三就不够灵活了。 因此,总结: 如果需求是删除所有特殊字符(包括标点和符号),且不需要保留任何符号,可以使用方法三(简单)。 如果需求是保留特定的字符集(比如只保留汉字、字母、数字、空格以及个别符号),则使用方法二。 根据用户之前的问题(排除中文特殊字符),我们通常需要保留字母数字和汉字,所以方法二更合适。 最后,注意在Java字符串中,反斜杠需要转义,所以写正则时要注意。 相关问题: 1. 如何匹配中文字符但不包括标点符号? 2. 正则表达式中如何同时排除中文和英文特殊字符? 3. 正则表达式中的Unicode属性类\p{P}和\p{S}分别代表什么? 4. 在Java正则表达式中,如何保留空格而删除其他空白字符(如制表符、换行符)? 我们可以生成如下相关问题: 1. 如何只删除中文标点但保留英文标点? 2. 在正则表达式中,如何排除换行符和制表符? 3. 使用正则表达式排除特殊字符时,如何避免删除字母和数字? 4. 正则表达式排除特殊字符对性能有什么影响? </think> ### 正则表达式排除特殊字符方法详解 #### 1. **排除型字符组法(推荐)** 使用 `[^...]` 匹配 **非目标字符集** 并替换为空字符串: ```java // 排除所有非汉字、字母、数字、空格的字符 String regex = "[^\\u4e00-\\u9fa5a-zA-Z0-9\\s]"; String result = input.replaceAll(regex, ""); ``` - **效果**:`"安全提示:请勿操作!#危险设备!"` → `"安全提示请勿操作危险设备"` - **原理**: - `\\u4e00-\\u9fa5`:匹配所有汉字(Unicode范围) - `a-zA-Z0-9`:匹配字母数字 - `\\s`:保留空格/换行符等空白字符 - `^`:排除字符组内定义的字符[^4] #### 2. **自定义排除法** 明确列出需排除的特殊字符: ```java // 排除中英文标点及符号 String regex = "[,。?!;:“”‘’()【】《》@#$%^&*+=\\\\|{}<>]"; String result = input.replaceAll(regex, ""); ``` - **效果**:`"警告:《高压区》禁止入内!"` → `"警告高压区禁止入内"` - **适用场景**:需精准控制排除范围时 #### 3. **Unicode属性法** 利用 `\p{P}` 匹配所有标点符号: ```java // 排除所有语言的标点符号(含中文) String regex = "\\p{P}"; String result = input.replaceAll(regex, ""); ``` - **效果**:`"注意:温度>40°C 时报警!"` → `"注意温度40C 时报警"` - **特点**:自动适配多语言标点[^5] --- ### ✨ 最佳实践示例 ```java public class SpecialCharFilter { public static void main(String[] args) { String input = "紧急通知:《系统升级》将于20:30开始!联系:400-1234"; // 方案1:保留汉字、字母、数字、空格 String regex1 = "[^\\u4e00-\\u9fa5a-zA-Z0-9\\s]"; System.out.println(input.replaceAll(regex1, "")); // 输出:紧急通知系统升级将于2030开始联系4001234 // 方案2:仅排除中文标点 String regex2 = "[,。?!;:“”‘’()【】《》]"; System.out.println(input.replaceAll(regex2, "")); // 输出:紧急通知系统升级将于20:30开始!联系:400-1234 } } ``` --- ### ⚠️ 关键注意事项 1. **转义特殊字符** 正则字符如 `[ ] ( ) { } . * + ? ^ $ | \` 需用 `\\` 转义: ```java // 正确排除小括号示例 String regex = "[\\(\\)]"; ``` 2. **Unicode扩展支持** 如需包含生僻字,追加扩展区: ```java // 扩展汉字范围(含生僻字) String regex = "[^\\u4e00-\\u9fa5\\u3400-\\u4DBF]"; ``` 3. **性能优化** - 预编译正则表达式(尤其循环操作时): ```java Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); return matcher.replaceAll(""); ``` - 避免复杂回溯:使用具体字符集代替 `.*?` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值