用于根据字符串内容添加HTML标记的功能

时间:2015-02-04 15:32:58

标签: php foreach

我尝试创建一个函数来处理要通过自动格式化发布的数据库中的文本。

如果有\n:它应转换为<p> ... </p>

如果有-:它还应添加列表标签

我的问题是我无法确定如何添加<ul></ul>代码。

function nl2p($string){
  $string = explode("\n", $string);
  $paragraphs = '';
  foreach ($string as $line) {
    if (trim($line)) {
      if (substr($line,0,1) == '-'){
        $paragraphs .= '<li>' . substr($line,1) . '</li>'."\r\n";
      } else {
        $paragraphs .= '<p>' . $line . '</p>'."\r\n";
      }
    }
  }
return $paragraphs;
}

4 个答案:

答案 0 :(得分:1)

使用变量(我的示例中为$ul):

function nl2p($string){
  $string = explode("\n", $string);
  $paragraphs = '';
  $ul = 0;
  foreach ($string as $line) {
    if (trim($line)) {
      if (substr($line,0,1) == '-'){
        if($ul == 0){
            $paragraphs .= "<ul>\r\n";
            $ul = 1;
        }
        $paragraphs .= '<li>' . substr($line,1) . '</li>'."\r\n";
      } else {
        if($ul == 1){
            $paragraphs .= "</ul>\r\n";
            $ul = 0;
        }
        $paragraphs .= '<p>' . $line . '</p>'."\r\n";
      }
    }
  }
return $paragraphs;
}

答案 1 :(得分:0)

使用字符串中的文字收集所有连续的<li>元素,然后将字符串括在<ul></ul>中。

答案 2 :(得分:0)

我会搜索第一个字符作为短划线,如果上一行没有以破折号开头,请在那里添加<ul>。然后将行包裹在li标记中并在结尾处进行相同的检查 - 如果下一行不以短划线开头,则添加</ul>

然后,作为默认操作,将该行包装在段落中。

$string = "this is a string.
New line 1.
New line 2.
- List item
- Another list item
Some more lines of text";

function nl2p($input) {
    $lines = explode("\r\n",$input);
    $return = '';
    foreach($lines as $key => $line) {
        if(strpos($line,'-') === 0) {
            if(array_key_exists($key-1,$lines) AND strpos($lines[$key-1],'-') === FALSE) {
                $return .= '<ul>' . "\r\n";
            }
            $return .= '<li>' . $line . '</li>' . "\r\n";
            if(array_key_exists($key+1,$lines) AND strpos($lines[$key+1],'-') !== 0) {
                $return .= '</ul>' . "\r\n";
            }
            continue;
        }
        $return .= '<p>' . $line . '</p>' . "\r\n";
    }
    return $return;
}
var_dump(nl2p($string));

/*
<p>this is a string.</p>
<p>New line 1.</p>
<p>New line 2.</p>
<ul>
<li>- List item</li>
<li>- Another list item</li>
</ul>
<p>Some more lines of text</p>

*/

答案 3 :(得分:0)

function nl2p($input) {
    if(strpos($input, "\n")) {
        $slash = explode("\n",$input);
        $newPara = '';
        foreach($slash as $slashval) {
            $slashval = '@'.$slashval;
            if(strpos($slashval,"-")) {
                $slashval = substr($slashval, 1);
                $hypen = explode("-",$slashval);
                $newPara .= '<ul>';
                foreach($hypen as $hypenval) {
                    if(!empty($hypenval)) {
                        $newPara .= '<li>'.$hypenval.'</li>';
                    }
                }
                $newPara .= '</ul>';
            } else {
                $slashval = substr($slashval, 1);
                $newPara .= '<p>'.$slashval.'</p>';
            }
        }
        return $newPara;
    } else {
        $slashval = $input;
        if(strpos($slashval,"-")) {
            $hypen = explode("-",$slashval);
            $newPara .= '<ul>';
            foreach($hypen as $cnt => $hypenval) {
                if($cnt == 0) {
                    $start = $hypenval;
                } else {
                    if(!empty($hypenval)) {
                        $newPara .= '<li>'.$hypenval.'</li>';
                    }
                }
            }
            $newPara .= '</ul>';
            $newPara = $start.$newPara;
        } else {
            $slashval = '@'.$input;
            if(strpos($slashval,"-")) {
                $slashval = substr($slashval, 1);
                $hypen = explode("-",$slashval);
                $newPara .= '<ul>';
                foreach($hypen as $hypenval) {
                    if(!empty($hypenval)) {
                        $newPara .= '<li>'.$hypenval.'</li>';
                    }
                }
                $newPara .= '</ul>';
            }   
        }
        return $newPara;
    }
    return $input;
}