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

あなたのロジックに欠陥があるようです:針が見つからない場合は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 に答える
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には、出力バッファリングと組み合わせる方法など、使用方法を示す良い記事があります。

投稿したコードに関しては、そのような if ステートメントで strpos を使用しないでください。PHPマニュアルを引用するには:

警告: この関数はブール値の FALSE を返す場合がありますが、0 や "" など、FALSE と評価されるブール値以外の値を返す場合もあります。. . この関数の戻り値をテストするには、=== 演算子を使用します。

したがって、文字列内に部分文字列が見つからなかったことをテストするには、次のようにします。

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 を変更して、タグが開いているstripos($text, $opentag) === falseことを確認できるかどうかを確認します。aあなたのビジネスロジックがそれを指示する可能性が最も高いと思うので、 substr(...) について何をすべきかを理解する必要があります。

于 2011-05-05T22:21:18.990 に答える