forked from Mobideck/php-snippets
-
Notifications
You must be signed in to change notification settings - Fork 0
/
escape_pre_tags.php
63 lines (43 loc) · 1.61 KB
/
escape_pre_tags.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<table border="1">
<?
test('1 <pre> foo </pre> 2');
test('1 <pre> <b>foo</b> </pre> 2');
test('1 <pre> <pre> foo </pre> </pre> 2');
test('1 <pre> <pre> foo </pre> 2');
test('1 <pre> foo </pre> </pre> 2');
function test($text){
$out = process($text);
echo "<tr><td>".HtmlSpecialChars($text)."</td><td>".HtmlSpecialChars($out)."</td></tr>";
}
#######################################################################
#
# this function escapes html inside <pre> tags, inclduing nested <pre> tags
#
function process($text){
$blocks = array();
while(preg_match('!</pre>!i', $text)){
$text = preg_replace('!^(.*?)</pre>!ie', 'process_block(StripSlashes("\\1"), $blocks)', $text);
}
$text = preg_replace('!{CODE-BLOCK-(\d+)}!e', '"<pre>".HtmlSpecialChars(unwind_block(\\1, $blocks))."</pre>"', $text);
return $text;
}
function process_block($text, &$blocks){
return preg_replace('!(.*)<pre>(.*?)$!ie', 'StripSlashes("\\1").process_block_2(StripSlashes("\\2"), $blocks)', $text);
}
function process_block_2($text, &$blocks){
$key = count($blocks)+1;
$blocks["block_$key"] = $text;
return "{CODE-BLOCK-$key}";
}
function unwind_block($id, &$blocks){
return unwind_block_2($blocks["block_$id"], $blocks);
}
function unwind_block_2($text, &$blocks){
while (preg_match('!{CODE-BLOCK-(\d+)}!', $text)){
$text = preg_replace('!{CODE-BLOCK-(\d+)}!e', '"<pre>".unwind_block_2($blocks["block_\\1"], $blocks)."</pre>"', $text);
}
return $text;
}
#######################################################################
?>
</table>