检查标题标签和内部编号列表级别的字符串
Check string for heading tags and inner numbered list level
我需要更正 heading-tags 和缺少 p-tags 的字符串:
<h3>1. Title</h3>
Text
<h3>1.1 Subtitle</h3>
Text
<h3>1.2. Subtitle</h3>
应该得到
<h2>1. Title</h2>
<p>Text</p>
<h3>1.1. Subtitle</h3>
<p>Text</p>
<h3>1.2. Subtitle</h3>
这意味着列表第一级的每个标题都应该是 h2 标签。第二级的格式可以是 1.1.
或 1.1
,应该用缺少的 .
进行更正
如果根本没有标签,则应添加 p-tag。
$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
if(!strpos($line,"<h")) $line = '<p>'.$line.'</p>';
$output = $output.$line;
}
所以这样就补上了缺失的p-tags,但是我不知道如何处理标题标签和二级的可选缺失点
试试这个:
$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
if(strpos($line,"<h") === false) $line = '<p>'.$line.'</p>';
$output = $output.$line;
}
或这个
$lines = explode(PHP_EOL, $text);
foreach ($lines as $key => $line)
{
if($key%2!=0) $line = '<p>'.$line.'</p>';
$output = $output.$line;
}
这将使用正则表达式来获取不同的部分,并根据数字确定要使用的 header 级别(h2
for 1.
,h3
对于 1.2
等)。如果您正在解析的 HTML 确实像您的示例一样简单,那么这将起作用。如果没有,我强烈建议您改为查看 DOMDocument 解析器。
$html = <<<EOS
<h3>1. Title</h3>
Text
<h3>1.1 Subtitle</h3>
Text
<h3>1.2. Subtitle</h3>
Text
EOS;
$lines = explode(PHP_EOL, $html);
foreach ($lines as $line) {
if (preg_match('/^<(\w.*?)>([\d\.]*)(.*?)</', $line, $matches)) {
$tag = $matches[1]; // "h3"
$number = $matches[2]; // "1.2"
$title = $matches[3]; // "Subtitle"
if ($tag == 'h3') {
$level = preg_match_all('/\d+/', $number) + 1;
$tag = 'h' . $level;
if (substr($number, -1, 1) != '.')
$number .= '.';
$line = "<$tag>$number$title</$tag>";
}
}
else {
$line = "<p>$line</p>";
}
echo $line, PHP_EOL;
}
输出:
<h2>1. Title</h2>
<p>Text</p>
<h3>1.1. Subtitle</h3>
<p>Text</p>
<h3>1.2. Subtitle</h3>
<p>Text</p>
这个怎么样?
$text = '<h3>1. Title</h3>
Text
<h3>1.1 Subtitle</h3>
Text
<h3>1.2. Subtitle</h3>';
$lines = explode(PHP_EOL, $text);
$lines[0] = str_replace('h3','h2',$lines[0]); // Need to replace h3 to h2 only on First node
// replace a array of string
$search_str = array('.1 ', '.2 ');
$replace_str = array('.1. ', '.2. ');
foreach($lines as $line){
if(!strchr($line,"<")){
$line = '<p>'.$line.'</p>';
}
$line = str_replace($search_str, $replace_str, $line);
print $line;
}
我需要更正 heading-tags 和缺少 p-tags 的字符串:
<h3>1. Title</h3>
Text
<h3>1.1 Subtitle</h3>
Text
<h3>1.2. Subtitle</h3>
应该得到
<h2>1. Title</h2>
<p>Text</p>
<h3>1.1. Subtitle</h3>
<p>Text</p>
<h3>1.2. Subtitle</h3>
这意味着列表第一级的每个标题都应该是 h2 标签。第二级的格式可以是 1.1.
或 1.1
,应该用缺少的 .
进行更正
如果根本没有标签,则应添加 p-tag。
$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
if(!strpos($line,"<h")) $line = '<p>'.$line.'</p>';
$output = $output.$line;
}
所以这样就补上了缺失的p-tags,但是我不知道如何处理标题标签和二级的可选缺失点
试试这个:
$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
if(strpos($line,"<h") === false) $line = '<p>'.$line.'</p>';
$output = $output.$line;
}
或这个
$lines = explode(PHP_EOL, $text);
foreach ($lines as $key => $line)
{
if($key%2!=0) $line = '<p>'.$line.'</p>';
$output = $output.$line;
}
这将使用正则表达式来获取不同的部分,并根据数字确定要使用的 header 级别(h2
for 1.
,h3
对于 1.2
等)。如果您正在解析的 HTML 确实像您的示例一样简单,那么这将起作用。如果没有,我强烈建议您改为查看 DOMDocument 解析器。
$html = <<<EOS
<h3>1. Title</h3>
Text
<h3>1.1 Subtitle</h3>
Text
<h3>1.2. Subtitle</h3>
Text
EOS;
$lines = explode(PHP_EOL, $html);
foreach ($lines as $line) {
if (preg_match('/^<(\w.*?)>([\d\.]*)(.*?)</', $line, $matches)) {
$tag = $matches[1]; // "h3"
$number = $matches[2]; // "1.2"
$title = $matches[3]; // "Subtitle"
if ($tag == 'h3') {
$level = preg_match_all('/\d+/', $number) + 1;
$tag = 'h' . $level;
if (substr($number, -1, 1) != '.')
$number .= '.';
$line = "<$tag>$number$title</$tag>";
}
}
else {
$line = "<p>$line</p>";
}
echo $line, PHP_EOL;
}
输出:
<h2>1. Title</h2>
<p>Text</p>
<h3>1.1. Subtitle</h3>
<p>Text</p>
<h3>1.2. Subtitle</h3>
<p>Text</p>
这个怎么样?
$text = '<h3>1. Title</h3>
Text
<h3>1.1 Subtitle</h3>
Text
<h3>1.2. Subtitle</h3>';
$lines = explode(PHP_EOL, $text);
$lines[0] = str_replace('h3','h2',$lines[0]); // Need to replace h3 to h2 only on First node
// replace a array of string
$search_str = array('.1 ', '.2 ');
$replace_str = array('.1. ', '.2. ');
foreach($lines as $line){
if(!strchr($line,"<")){
$line = '<p>'.$line.'</p>';
}
$line = str_replace($search_str, $replace_str, $line);
print $line;
}