用于标题标记的PHP中的Preg_replace

时间:2014-10-08 10:23:50

标签: php regex preg-replace markdown

我有一个降价文本内容,我必须在不使用库函数的情况下进行替换。所以我使用了preg替换。对于某些情况,它可以正常工作。对于像标题这样的情况

    for eg Heading
           ======= 

should be converted to <h1>Heading</h1> and also

    ##Sub heading should be converted to <h2>Sub heading</h2>
    ###Sub heading should be converted to <h3>Sub heading</h3>

我试过了

$text = preg_replace('/##(.+?)\n/s', '<h2>$1</h2>', $text);

以上代码有效,但我需要计算哈希符号,并根据我必须分配标题标记。

任何人都可以帮助我....

2 个答案:

答案 0 :(得分:1)

像这样做一个preg_match_all:

$string = "#####asdsadsad";
preg_match_all("/^#/", $string, $matches);
var_dump ($matches);

根据比赛次数,你可以做任何你想做的事。

或者,使用preg_replace_callback功能。

$input = "#This is my text";
$pattern = '/^(#+)(.+)/';
$mytext = preg_replace_callback($pattern, 'parseHashes', $input);
var_dump($mytext);

function parseHashes($input) {
    var_dump($input);
    $matches = array();
    preg_match_all('/(#)/', $input[1], $matches);
    var_dump($matches[0]);
    var_dump(count($matches[0]));
    $cnt = count($matches[0]);
    if ($cnt <= 6 && $cnt > 0) {
        return '<h' . $cnt . ' class="if you want class here">' . $input[2] . '</h' . $cnt . '>';
    } else {
        //This is not a valid h tag. Do whatever you want.
        return false;
    }
}

答案 1 :(得分:1)

尝试使用preg_replace_callback 像这样的东西 -

$regex = '/(#+)(.+?)\n/s';
$line = "##Sub heading\n ###sub-sub heading\n";
$line = preg_replace_callback(
            $regex,
            function($matches){
                $h_num = strlen($matches[1]);
                return "<h$h_num>".$matches[2]."</h$h_num>";
            },
            $line
        );
echo $line;

输出将是这样的 -

<h2>Sub heading</h2> <h3>sub-sub heading</h3>

修改
对于使用=作为标题而使用#作为子标题的组合问题,正则表达式有点复杂,但使用preg_replace_callback的原则保持不变。 试试这个 -

$regex = '/(?:(#+)(.+?)\n)|(?:(.+?)\n\s*=+\s*\n)/';
$line = "Heading\n=======\n##Sub heading\n ###sub-sub heading\n";
$line = preg_replace_callback(
            $regex,
            function($matches){
                //var_dump($matches);
                if($matches[1] == ""){
                    return "<h1>".$matches[3]."</h1>";  
                }else{
                    $h_num = strlen($matches[1]);
                    return "<h$h_num>".$matches[2]."</h$h_num>";
                }   
            },
            $line
        );
echo $line;

谁的输出是 -

<h1>Heading</h1><h2>Sub heading</h2> <h3>sub-sub heading</h3>