php 正则表达式仅保留字母数字拉丁字符、标点符号和 html

php regex keep only alphanumerical latin characters, punctuations and html

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

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

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

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

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

字符串和分隔形式 '~..~' :

'~(?>(?><(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|\'[\S\s]*?\'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\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]*?<‌​/\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}]