我一直在玩preg_
功能一段时间没有运气。我尝试删除一段字符串,我尝试将它们取出并将它们放回原处等等,没有运气。
我有一系列允许的字符或段,我只想从不在此数组中的字符串中删除任何内容。如何在不破坏字符串结构的情况下执行此操作?
这是我期望它做的事情:
$allowed = array('<', '>', 'p', 'sc');
echo clean('<script>'); // <scp>
加分问题:我应该使用mb_ereg_match
确保UTF-8正常工作吗?
提前致谢。
答案 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, '#');
};
后者可能要快一点......