php正则表达式只保留字母数字拉丁字符,标点符号和HTML

时间:2017-04-21 01:17:52

标签: php regex preg-replace

我已经想出了如何在保持重音的同时过滤掉非字母数字字符,但我怎么能保持标点符号和普通的键盘字符,如!%$#& @ *()[] :; / - + _ = ,

我还需要保留字符串中的所有html标记和BR换行符。这可能吗?

$caption = preg_replace('/[^\p{Latin}\d\s\p{P}]/u', '', $caption);

1 个答案:

答案 0 :(得分:1)

这应该有效。它保留了所有特殊的键盘字符和所有 html标签 并只是针对其他项目。

正则表达式使用原子分组作为标签和特殊字符 结果应该很快。

'~..~'为格式和分隔的格式:

'~(?>(?><(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|\'[\S\s]*?\'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|\'[\S\s]*?\'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>|[!%$#&@*()\[\]^:;/+_=.,\~-])(*SKIP)(*FAIL))|[^\p{Latin}\d\s\p{P}]~'

原始形式:

(?>(?><(?:(?:(?:(script|style|object|embed|applet|noframes|n‌​oscript|noembed)(?:\‌​s+(?>"[\S\s]*?"|'[\S‌​\s]*?'|(?:(?!/>)[^>]‌​)?)+)?\s*>)[\S\s]*?<‌​/\1\s*(?=>))|(?:/?[\‌​w:]+\s*/?)|(?:[\w:]+‌​\s+(?:"[\S\s]*?"|'[\‌​S\s]*?'|[^>]?)+\s*/?‌​)|\?[\S\s]*?\?|(?:!(‌​?:(?:DOCTYPE[\S\s]*?‌​)|(?:\[CDATA\[[\S\s]‌​*?\]\])|(?:--[\S\s]*‌​?--)|(?:ATTLIST[\S\s‌​]*?)|(?:ENTITY[\S\s]‌​*?)|(?:ELEMENT[\S\s]‌​*?))))>|[!%$#&@*()\[‌​\]^:;/+_=.,~-])(*SKI‌​P)(*FAIL))|[^\p{Lati‌​n}\d\s\p{P}]