3

ランダムな HTML コードでフォーマットされた変数があります。私はそれを呼び出して{$text}切り捨てます。

値は次のとおりです。

<div>Lorem <i>ipsum <b>dolor <span>sit </span>amet</b>, con</i> elit.</div>

テキストの最初の ~30 文字を切り捨てると、次のようになります。

<div>Lorem <i>ipsum <b>dolor <span>sit 

問題は、要素を閉じることができないことです。したがって、<*>コード内の要素 (* は何でもかまいません) をチェックし、終了タグがない場合は終了するスクリプトが必要です。

これで私を助けてください。ありがとう。

営業時間後の解決策、および 4 票アップ @ stackoverflow:

PHP:

...
function closetags($content) {
   preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $content, $result);
    $openedtags = $result[1];
  preg_match_all('#</([a-z]+)>#iU', $content, $result);
 $closedtags = $result[1];
  $len_opened = count($openedtags);
  if (count($closedtags) == $len_opened) {
       return $content;
  }
  $openedtags = array_reverse($openedtags);
  for ($i=0; $i < $len_opened; $i++) {
        if (!in_array($openedtags[$i], $closedtags)) {
         $content .= '</'.$openedtags[$i].'>';
       } else {
           unset($closedtags[array_search($openedtags[$i], $closedtags)]);
        }
  }
  return $content;
}
...

TPL:

{$pages[j].text|truncate:300|@closetags}
4

3 に答える 3

0

簡単にするために、コードが切り捨てる前に有効なXMLであり、タグを半分に切り取らない場合、アルゴリズムは次のようになります。

  • オープニングタグをスタックにプッシュします
  • 終了タグを見つけたら、それらをポップします(コードが有効な場合に一致します)
  • 最後に到達したら、ポップを開始してクロージングを作成します。残りのタグは、元の(切り捨てられた)テキストに追加する必要があります。

例:

<div>Lorem <i>ipsum <b>dolor <span>sit </span>amet</b><div>
  • 「div」、「i」、「b」、「span」を押します
  • 終了タグ「span」が見つかりました
  • ポップ「スパン」
  • 終了タグ「b」が見つかりました
  • ポップ「b」
  • 「div」を押す
  • 切り捨てられたテキストの終わり
  • 「div」をポップ-></div>テキストに追加
  • 「b」をポップ-></b>テキストに追加
  • 「i」をポップ-></i>テキストに追加
  • 「div」をポップ-></div>テキストに追加
  • 終わり
于 2010-04-19T22:06:48.420 に答える
0

開いているタグをすべて取り出し、配列 (array_1) に 1 つずつプッシュします。

すべての閉じたタグを引き出し、それらを配列 (array_2) に 1 つずつプッシュします (これには自己終了タグが含まれます)。

2 番目の配列 (array_2) に見つからない最初の配列 (array_1) のタグについては、それらを html に追加します。

[編集]

もちろん、このメソッドは、適切な html を記述しないと惨めに失敗します...しかし、どうしたの?

もう 1 つの方法は、文字列を先読みして、どのタグが閉じられているかを確認し、必要に応じて閉じることです。

于 2010-04-19T21:47:07.193 に答える