如何从字符串PHP中删除非文本字符

时间:2017-03-29 14:54:16

标签: php regex unicode preg-replace str-replace

如何从字符串中替换字符?有时YouTube视频标题包含这样的字符。我不想替换像!@#$%^& *()这样的字符。

我目前正在使用preg_replace('/[^A-Za-z0-9\-]/', '', $VideoTitle);

样本数组:

$VideoTitles[]='Sia 2017 Cheap Thrills 2017 live '; 

$VideoTitles[]='TAYLOR SWIFT - SHAKE IT OFF  #1989'; 

预期产出:

Sia 2017 Cheap Thrills 2017 live 
TAYLOR SWIFT - SHAKE IT OFF #1989

2 个答案:

答案 0 :(得分:1)

带示例输入的代码:Demo

$VideoTitles=[
    'Kilian à Dijon #4 • Vlog #2 • Primark again !?  - YouTube',
    'Funfesty   on Twitter: "Je commence à avoir mal à la tête à force',
    'Sia 2017 Cheap Thrills 2017 live '
];

$VideoTitles=preg_replace('/[^ -\x{2122}]\s+|\s*[^ -\x{2122}]/u','',$VideoTitles);  // remove out of range characters and whitespace character on one side only

var_export($VideoTitles);

输出:

array (
  0 => 'Kilian à Dijon #4 • Vlog #2 • Primark again !? - YouTube',
  1 => 'Funfesty on Twitter: "Je commence à avoir mal à la tête à force',
  2 => 'Sia 2017 Cheap Thrills 2017 live',
)

上述正则表达式模式使用的字符范围为\x20-\x2122 space trade-mark-sign )。我选择了这个范围是因为它应该覆盖绝大多数与单词相关的字符,包括带重音和非英文字符的字母。 (不可否认,它还包含许多与单词无关的字符。您可能希望使用两个单独的范围以获得更高的特异性,例如:/[^\x{20}-\x{60}\x{7B}-\x{FF}]/ui - 这种不区分大小写搜索两个范围: space 严重重音左大括号带分音符的拉丁小写字母

如果您发现此范围不必要地慷慨或需要花费太长时间来处理,您可以自行决定适当的字符范围。

例如,你可能喜欢更轻但更不慷慨的/[^\x20-\x7E]/u(从空间代替)。但是,如果您将其应用于我的上述法语$VideoTitles之一,那么您将通过删除合法字母来破坏文本。

这是一个menu of characters and their unicode numbers,可以帮助您了解上述范围内的内容。

*请记住在结算分隔符后包含一个unicode标志u

为了完整起见,我应该说删除两个表情符号的字面/窄解决方案是:

$VideoTitle=preg_replace('/[\x{1F3A7}\x{1F3AC}]/u','',$VideoTitle);  // omit 2 emojis

这些表情符号被称为"拍板(U + 1F3AC)"和#34;耳机(U + 1F3A7)"。

答案 1 :(得分:0)

function removeEmoticon($text) {

$cleanText = "";

// Match Emoticons
$regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
$cleanText     = preg_replace($regexEmoticons, '', $text);

// Match Miscellaneous Symbols and Pictographs
$regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
$cleanText   = preg_replace($regexSymbols, '', $cleanText);

// Match Transport And Map Symbols
$regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
$cleanText     = preg_replace($regexTransport, '', $cleanText);

// Match Miscellaneous Symbols
$regexMisc  = '/[\x{2600}-\x{26FF}]/u';
$cleanText = preg_replace($regexMisc, '', $cleanText);

// Match Dingbats
$regexDingbats = '/[\x{2700}-\x{27BF}]/u';
$cleanText    = preg_replace($regexDingbats, '', $cleanText);

return $cleanText;

}