php preg_replace - 保留指定字符+外文字母

问题描述 投票:0回答:2

我需要一个函数,从字符串中删除所有字符(未在模式中列出),但保留外语字母。我知道 preg_replace 有 \p “模式”,但由于某种原因我无法让它工作。

我使用这个函数来删除字符串中的所有垃圾:

$main_content=preg_replace("/[^a-zA-Z0-9`~!@#\$%\^&\*\(\)-_=\+\\|\,<\.>\/\?;:'\"\[\]\s]/", "", $main_content); //remove all symbols that do NOT match these

简单来说,该函数应该保留所有标准字母/数字和标准符号,如 +-!@#$ 等,并删除所有垃圾,如 © ™ 等。如果有比我使用的更好的方法来编写这样的 preg_replace,请告诉我。

现在我想要保留外语字母的功能,所以我修改为

$main_content=preg_replace("/[^\p{L}a-zA-Z0-9`~!@#\$%\^&\*\(\)-_=\+\\|\,<\.>\/\?;:'\"\[\]\s]/", "", $main_content); //remove all symbols that do NOT match these

(您会注意到添加了 \p{L})。不幸的是,它没有按预期工作。当我回显文本时,我看到外语没有被删除(这很好),但它们被转换为 � (这很糟糕)。

如何解决?

php unicode preg-replace
2个回答
3
投票

\p{L} 仅适用于 u 修饰符:

$main_content=preg_replace("/[^\p{L}]/u", "", $main_content);

注意 / 之后添加了 u


0
投票

Preg 替换允许您使用 p{L} 来表示任何语言的任何字符,但这并不总是唯一的解决方案。

还有 p{N} 也涵盖任何类型的数字字符。

最后,您还应该注意某些语言中的其他字符,例如泰国和阿拉伯国家,其中有 p{L} 单独无法涵盖的“语气”或“情感”字符。此外,还有 0-9 之外的数字字符。

对于泰国,您可以添加 \p{Thai} ,然后允许使用特殊音调字符,这些字符基本上是上面悬停有小字形的字符。

举个例子:-

// This will replace everything but any alpha-numeric character from any 
language and also not replace any tone characters in Thailand.
Why are the tones characters not included as part of the any character list? I have no idea in all honesty.
$str = preg_replace("/[^\p{L}\p{N}\p{Thai}]/u","",$str);

/*
List of the others:-

\p{Common}
\p{Arabic}
\p{Armenian}
\p{Bengali}
\p{Bopomofo}
\p{Braille}
\p{Buhid}
\p{Canadian_Aboriginal}
\p{Cherokee}
\p{Cyrillic}
\p{Devanagari}
\p{Ethiopic}
\p{Georgian}
\p{Greek}
\p{Gujarati}
\p{Gurmukhi}
\p{Han}
\p{Hangul}
\p{Hanunoo}
\p{Hebrew}
\p{Hiragana}
\p{Inherited}
\p{Kannada}
\p{Katakana}
\p{Khmer}
\p{Lao}
\p{Latin}
\p{Limbu}
\p{Malayalam}
\p{Mongolian}
\p{Myanmar}
\p{Ogham}
\p{Oriya}
\p{Runic}
\p{Sinhala}
\p{Syriac}
\p{Tagalog}
\p{Tagbanwa}
\p{TaiLe}
\p{Tamil}
\p{Telugu}
\p{Thaana}
\p{Thai}
\p{Tibetan}
\p{Yi}
*/

这篇精彩的文章以精彩的细节涵盖了所有内容,并为您提供了大量可供尝试的示例。 https://www.regular-expressions.info/unicode.html#category

© www.soinside.com 2019 - 2024. All rights reserved.