【问题标题】:php regex keep only alphanumerical latin characters, punctuations and htmlphp regex 仅保留字母数字拉丁字符、标点符号和 html
【发布时间】:2017-04-21 01:17:52
【问题描述】:

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

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

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

【问题讨论】:

  • 也许像 <\/?.+?>(*SKIP)(*FAIL)|[^\p{Latin}\d\s\p{P}] 这样的东西虽然这并不能真正验证它是一个 HTML 元素,但更多的是你有一个 < 和一个 > 介于两者之间。

标签: php regex preg-replace


【解决方案1】:

这应该可行。它保留了所有特殊的键盘字符和 all 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}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2014-03-22
    • 1970-01-01
    • 2019-05-26
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多