我有一个降价文本内容,我必须在不使用库函数的情况下进行替换。所以我使用了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);
以上代码有效,但我需要计算哈希符号,并根据我必须分配标题标记。
任何人都可以帮助我....
答案 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>