我正试图找到一种从用户输入的字符串中删除标记的方法,除了包含在[code] [/ code] BB样式标记中的标记。
例如,用户可以输入:
<script>alert("hacked");</script>
[code]<script>alert("hello");</script>[/code]
我想要删除的“黑客”警报,而不是“Hello”警报。
我想删除[code]之外的所有标签(php,html,css,js),但允许其中的任何内容。
到目前为止,我已经得到了以下代码来反转我想要的内容:
preg_replace('/\[code\](.*?)\[\/code\]/ise','strip_tags(\'$1\')',$code)
答案 0 :(得分:3)
我不确定这是否是最好的算法,但这是一个想法。
[code]
块移除到数组[code]
块。这是对那个算法的抨击
<?php
header( 'Content-Type: text/plain' );
$input = <<<BB
[code]<script>alert("hello");</script>[/code]
some text <script>alert("hacked");</script> some other text
[code]<script>alert("hello");</script>[/code]
some text <script>alert("hacked");</script> some other text
[code]<script>alert("hello");</script>[/code]
BB;
echo strip_custom( $input );
function strip_custom( $content )
{
$pattern = "#\\[code].*?\\[/code]#i";
if ( preg_match_all( $pattern, $content, $codeBlocks ) )
{
return array_join( $codeBlocks[0], array_map( 'strip_tags', preg_split( $pattern, $content ) ) );
}
return strip_tags( $content );
}
function array_join( array $glue, array $pieces )
{
$glue = array_values( $glue );
$pieces = array_values( $pieces );
$piecesSize = count( $pieces );
if ( count( $glue ) + 1 != $piecesSize )
{
return false;
}
$joined = array();
for ( $i = 0; $i < $piecesSize; $i++ )
{
$joined[] = $pieces[$i];
if ( isset( $glue[$i] ) )
{
$joined[] = $glue[$i];
}
}
return implode( '', $joined );
}
答案 1 :(得分:1)
这是正则表达式不理想的地方。当你知道“你想要什么”而不是“你不想想要什么”时,正则表达式是极好的。我的建议是你试图找到另一种做同样事情的方法,但没有正则表达式。
答案 2 :(得分:0)
您希望将HTML Parser用于此作业。
我不知道PHP,但谷歌发现了HTML Parser for PHP。
答案 3 :(得分:0)
使用这样的简单解析器:
stack-pointer = 0
while not finished:
stack-pointer-n = code-start-matched or endl
tag-free-str = regex-magic-to-strip-tags(extract-str(stack-pointer, stack-pointer-n))
preserve-str = extract-str(stack-pointer-n, code-endl-matched or endl)
stack-pointer = code-endl-matched + 1
push(tag-free-str)
push(preserve-str)