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

时间:2012-03-04 08:49:59

标签: php regex

我一直在玩preg_功能一段时间没有运气。我尝试删除一段字符串,我尝试将它们取出并将它们放回原处等等,没有运气。

我有一系列允许的字符或段,我只想从不在此数组中的字符串中删除任何内容。如何在不破坏字符串结构的情况下执行此操作?

这是我期望它做的事情:

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

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

提前致谢。

1 个答案:

答案 0 :(得分:3)

使用[^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以外的Charset时使用


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

也可能

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

后者可能要快一点......