regex — Preg Replace в PHP для заголовочных тегов

У меня есть текстовое содержание уценки, которое я должен заменить без использования библиотечных функций. Так что я использовал preg replace для этого. В некоторых случаях он работает нормально. Для случаев, таких как заголовок

    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);

Приведенный выше код работает, но мне нужно иметь счетчик хеш-символов, и на основании этого я должен назначить теги заголовков.

Кто-нибудь, помогите мне, пожалуйста ….

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>
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

По вопросам рекламы [email protected]