如何用属性替换bbcode标签

时间:2014-05-02 23:09:12

标签: php regex

我的共享服务器最近升级到php5.4,破坏了PEAR HTMLBBcode。

我尝试编写一个小函数来替换一些简单bbcode的解析器,我在一些论坛上找到了一些代码。

我要解析的bbcode包含标签,例如带有属性的图片标签:

[img src="" h="" w="" alt=""]
[*] //for bulleted lists


由于我对正则表达式的了解有限,也许有人可以解释如何向img行添加属性?我假设@是为了抑制preg_replace()的错误?

你将如何处理这个标签[*]?

// original function
function bbCode($string) {
    $search = array(    
        '@\[(?i)img\](.*?)\[/(?i)img\]@si',
        '@\[url\s*=\s*(.*?)\s*\](.*?)\[\/url\]@si'
    );
    $replace = array(
        '<img src="\\1">',
        '<a href="\\1">\\2</a>'
    );
    return preg_replace($search , $replace, $string);
}


// test
function bbCode($string) {
    $search = array(    
        '@\[img\s*=\s*(.*?)\s*\
         \s*=[(0-9)+]
         \s*=[(0-9)+]
         \s*=\s*(.*?)\s*\]
         (.*?)\[\/img\]@si',
        '[*]'
    );
    $replace = array(
        '<img src="\\1" height="\\2" width="\\3" alt="\\4">',
        '<li></li>'
    );
    return preg_replace($search , $replace, $string);
}

2 个答案:

答案 0 :(得分:0)

Square Brackets是用于创建组的正则表达式中的特殊字符。星号也是正则表达式指令。如果您尝试匹配文字内容,则都需要进行转义。您可能希望将测试代码更改为此类代码。但是一定要测试我的建议,因为我是从袖口做起来的,并没有先确认。

// test
function bbCode($string) {
    $search = array(    
        '@\[img\s*=\s*(.*?)\s*\
         \s*=[(0-9)+]
         \s*=[(0-9)+]
         \s*=\s*(.*?)\s*\]
         (.*?)\[\/img\]@si',
        '\[\*\]'
    );
    $replace = array(
        '<img src="\\1" height="\\2" width="\\3" alt="\\4">',
        '<li></li>'
    );
    return preg_replace($search , $replace, $string);
}

答案 1 :(得分:0)

解决这些问题所需的正则表达式需要仔细研究。 PEAR bbcode库已朝这个方向迈出了许多步骤。

虽然PEAR库仍然存在小问题,但它仍然比我们在这里尝试的要好。

我在php.ini中添加了路径,但由于某种原因它返回了错误

require "/path/to/pear";

我的主机支持能够通过

简单地修复引用
include "../path/to/pear_bbcode";