我被困在一个将HTML转换为bbcode的函数上。 我编写了自己的[剧透] bbcode标签,可以正确转换为HTML等效标签。
但是当我试图把它变回bbcode时,似乎并不匹配看似相同的字符串......
在逐步重建之后看看问题出在哪里,事实证明只有当我添加onclick="showSpoiler(this)"
到
#<div><input type="button" onclick="showSpoiler(this)"/><div>(.*)</div></div>#ig'
我将它进一步缩小到(括号。我试图像这样逃避它们\(
从[剧透]标签生成的html代码是:
`$ 1
和它匹配的字符串是这个
'#<div><input type="button" onclick="showSpoiler(this)"/><div>(.*)</div></div>#ig'
这里是转换函数
<?php
//This function let convert BBcode to HTML
function bbcode_to_html($text)
{
$text = nl2br(htmlentities($text, ENT_QUOTES, 'UTF-8'));
$in = array(
'#\[b\](.*)\[/b\]#Usi',
'#\[i\](.*)\[/i\]#Usi',
'#\[u\](.*)\[/u\]#Usi',
'#\[s\](.*)\[/s\]#Usi',
'#\[img\](.*)\[/img\]#Usi',
'#\[url\]((ht|f)tps?\:\/\/(.*))\[/url\]#Usi',
'#\[url=((ht|f)tps?\:\/\/(.*))\](.*)\[/url\]#Usi',
'#\[left\](.*)\[/left\]#Usi',
'#\[center\](.*)\[/center\]#Usi',
'#\[right\](.*)\[/right\]#Usi',
'#\[spoiler\](.*)\[/spoiler\]#Usi',
'#\[fuck\](.*)\[/fuck\]#Usi'
);
$out = array(
'<strong>$1</strong>',
'<em>$1</em>',
'<span style="text-decoration:underline;">$1</span>',
'<span style="text-decoration:line-through;">$1</span>',
'<img src="$1" alt="Image" />',
'<a href="$1">$1</a>',
'<a href="$1">$4</a>',
'<div style="text-align:left;">$1</div>',
'<div style="text-align:center;">$1</div>',
'<div style="text-align:right;">$1</div>',
'<div><input type="button" onclick="showSpoiler(this)" value="Show/Hide" /><div class="inner" style="display:none;">$1</div></div>',
'<div><input type="button" onclick="showSpoiler(this)"/><div>$1</div></div>'
);
$count = count($in)-1;
for($i=0;$i<=$count;$i++)
{
$text = preg_replace($in[$i],$out[$i],$text);
}
return $text;
}
//This function let convert HTML to BBcode
function html_to_bbcode($text)
{
$text = str_replace('<br />','',$text);
$in = array(
'#<strong>(.*)</strong>#Usi',
'#<em>(.*)</em>#Usi',
'#<span style="text-decoration:underline;">(.*)</span>#Usi',
'#<span style="text-decoration:line-through;">(.*)</span>#Usi',
'#<img src="(.*)" alt="Image" />#Usi',
'#<a href="(.*)">(.*)</a>#Usi',
'#<div style="text-align:left;">(.*)</div>#Usi',
'#<div style="text-align:center;">(.*)</div>#Usi',
'#<div style="text-align:right;">(.*)</div>#Usi',
'#<div><input type="button" onclick="showSpoiler(this)" value="Show/Hide" /><div class="inner" style="display:none;">(.*)</div></div>#Ui',
'#<div><input type="button" onclick="showSpoiler(this)"/><div>(.*)</div></div>#ig'
);
$out = array(
'[b]$1[/b]',
'[i]$1[/i]',
'[u]$1[/u]',
'[s]$1[/s]',
'[img]$1[/img]',
'[url=$1]$2[/url]',
'[left]$1[/left]',
'[center]$1[/center]',
'[right]$1[/right]',
'[spoiler]$1[/spoiler]',
'[fuck]$1[/fuck]'
);
$count = count($in)-1;
for($i=0;$i<=$count;$i++)
{
$text = preg_replace($in[$i],$out[$i],$text);
}
return $text;
}
?>
答案 0 :(得分:1)
在你的正则表达式中你需要像这样逃避括号:
showSpoiler\(this\)
注意正则表达式,它们是一种独立的语言,很难调试,除非你添加更多的函数进行调试(例如匹配的内容,输出等)。
BTW您可以通过直接将数组传递给函数来运行多个搜索和替换操作。你不需要迭代它们。
最好再次阅读有关preg_replace
的手册页,并期待如何更轻松地调试模式。例如。在将它们放入函数之前对它们进行测试。