我玩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, '#');
};
后者可能稍微快一点…