2

我无法弄清楚为什么这段代码不起作用:

<?php
  $text = "<a><li><ul><ol>Hello";
  $tags = array('a', 'li', 'ul', 'ol');
  $tagcount = count($tags);
  $i = 0;

  while ($i < $tagcount) {
      $opentag = "<".$tags[$i];
      $closetag = "</".$tags[$i].">";

      if (stripos($text, $opentag)) {
          $lastopen = strripos($text, $opentag);
          $lastclose = strripos($text, $closetag);

          if ($lastopen > $lastclose) {
              $text = substr($text, 0, $lastopen);
              echo $tags[$i] . " tag was open. ";
          } else {
              echo $tags[$i] . " tag was closed. ";
      } else {
          echo $tags[$i] . " tag was not open. ";
      $i++;
  }
?>

它应该做的至少是表明 $tags 数组中的所有标签都是打开的。它旨在使用 substr() 来确保没有打开任何标签,但它不起作用。运行这个给出:

标签未打开。li 标签已打开。ul 标签未打开。ol 标签未打开。

即使它们都是开放的。任何帮助将不胜感激。

4

4 回答 4

0

这是一个使用正则表达式的示例:

  $text = "<a><li><ul><ol>Hello";
  $tags = array('a', 'li', 'ul', 'ol');
  $tagcount = count($tags);
  $i = 0;
  $matches = array();
  foreach ($tags as $tag)
  {
    $closed = preg_match_all("/<\/".$tag.">/i", $text, $matches);
    $open = preg_match_all("/<".$tag.">/i", $text, $matches);

    if ($open == 0)
    {
        echo $tag." was not opened, ";
    }
    else if ($open > $closed)
    {
        echo $tag." was left open, ";
    }
    else
    {
        echo $tag." was closed properly, ";
    }
}
于 2011-05-05T22:29:06.597 回答
0

解析 HTML 并非易事,并且有一些很好的库可以为您完成这项工作。Tidy库从 PHP 5 开始可用,可用于解析和整理 HTML 片段,或完成页面输出。有一篇关于 devzone的好文章展示了如何使用它,包括如何将它与output buffering结合起来。

关于您发布的代码,您不应该在这样的 if 语句中使用 strpos 。引用 PHP 手册:

警告:此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值,例如 0 或 "" 。. . 使用 === 运算符测试此函数的返回值。

因此,要测试在字符串中未找到子字符串,请执行以下操作:

if(strpos($haystack, $needle) === FALSE)

并测试是否找到了子字符串:

if(strpos($haystack, $needle) !== FALSE)

但我真的,真的会建议使用预先存在的库进行 HTML 操作或验证,特别是如果它是安全敏感的(例如反 XSS)。

于 2011-05-05T22:29:22.387 回答
0

<a>是“未打开”,因为 stripos 将返回第一次出现的位置,并且第一次出现在索引 0 处(计算结果为 false)。

<li>被发现是打开的,因为它的索引不为零。但是随后您截断搜索字符串,以便<ul>在零索引处找到下一次迭代......

更改您的 if tostripos($text, $opentag) === false并查看是否允许您找到a打开的标签。您必须弄清楚如何处理 substr(...) ,因为我认为您的业务逻辑很可能会决定这一点。

于 2011-05-05T22:21:18.990 回答
0

看来您的逻辑有缺陷:如果找不到针则strripos返回,因此在您的内部语句中,您正在测试一个数字是否大于.falseiffalse

对于您的外部if语句,您需要测试是否为 false:

if (stripos($text, $opentag) !== false) {
  // found at position 0 or more...

你的内心if应该是这样的:

    if (($lastclose !== false) && ($lastopen > $lastclose)) {
于 2011-05-05T22:24:01.530 回答