У меня есть текстовое содержание уценки, которое я должен заменить без использования библиотечных функций. Так что я использовал 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);
Приведенный выше код работает, но мне нужно иметь счетчик хеш-символов, и на основании этого я должен назначить теги заголовков.
Кто-нибудь, помогите мне, пожалуйста ….
Попробуйте использовать 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>
Сделайте 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;
}
}