检查字符串标题和内部编号列表级别

时间:2015-03-23 15:10:45

标签: php regex html-parsing

我需要更正带有错误标题标签和缺少p标签的字符串:

<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标签。

$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
    if(!strpos($line,"<h")) $line = '<p>'.$line.'</p>';
    $output = $output.$line;
}

所以这会添加缺少的p标签,但我不知道如何处理标题标签和第二级的可选缺失点。

3 个答案:

答案 0 :(得分:0)

试试这个:

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

}

答案 1 :(得分:0)

这将使用正则表达式来获取不同的部分,并确定要使用的标头级别,具体取决于h2的{​​{1}},1.的{​​{1}}等等)。如果您正在解析的HTML实际上就像您的示例一样简单,那么这将起作用。如果没有,我强烈建议你改为查看DOMDocument解析器。

h3

输出:

1.2

答案 2 :(得分:0)

这个怎么样?

$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;
}