删除任何不在数组中的内容


Remove anything not in an array

我玩preg_函数已经有一段时间了,现在运气不好。我试着去掉一根绳子的片段,我试着把它们拿出来再放回一起,等等,但运气不好。

我有一个允许的字符或段的数组,我只想从不在这个数组中的字符串中删除任何内容。我怎样才能做到这一点而不破坏弦的结构?

这就是我所期望的:

$allowed = array('<', '>', 'p', 'sc');
echo clean('<script>'); // <scp>

附加问题:我应该使用mb_ereg_match来确保UTF-8也能正常工作吗?

提前谢谢。

使用表达式(如[^a-c])可以很容易地删除除一组字符之外的所有字符,该表达式匹配除小写字符a, b, c之外的所有内容。对于字符序列(如sc),这当然不起作用。

但如果你知道你想保留哪些角色,你就可以扭转游戏局面。提取您想要保留的内容,忽略其余内容:

<?php
$text = 'hello <script> |world # / foo';
$allowed = array('<', '>', 'p', 'sc', '|', '#');
array_walk($allowed, function(&$value){
    $value = preg_quote($value, '#');
});
$pattern = '#' . join('|', $allowed) . '#iu';
$text = preg_match_all($pattern, $text, $matches);
$text = join('', $matches[0]);
echo $text, "'n";

额外的问题:我应该使用mb_ereg_match来确保UTF-8也能正常工作吗?

PCRE可以使用/u标志执行UTF-8。mb_ereg_*比PCRE慢,只应在处理UTF-8 ISO-8859-1 以外的字符集时使用


array_walk($allowed, function(&$value){
    $value = preg_quote($value, '#');
});

也可以是

foreach ($allowed as &$value) {
    $value = preg_quote($value, '#');
};

后者可能稍微快一点…