0

h22番目のタグをに置き換えたいのですが、h3誰かが代わりの正規表現で私を助けてくれることを願っています.-preg_split正確にはわかりません.

たとえば、次のようになります。

<h2>My text one</h2>
<h2>My text two</h2>
text …
<h2>My text three</h2>

これになるはずです:

<h2>My text one</h2>
<h3>My text two</h3>
text …
<h2>My text three</h2>
4

3 に答える 3

2

Javascriptを使えば簡単にできますが、本当に PHP を使う必要があるのでしょうか?

2 番目の<h2>値を取得する

$text = $("h2:eq(1)").html();

それを破壊します。

$("h2:eq(1)").remove();

<h3>最初の の後に を<h2>作成し、その$text中に

$("h2:eq(0)").after("<h3>" + $text + "</h3>");
于 2012-11-19T18:42:51.683 に答える
2

私は他の解説に同意します。これはdomパーサーを介して行う必要があります。しかし、それでもなお、動作するphpソリューションがあります。

<?php 
     // Fill $str with the html;

     preg_replace("/[h]{1}[2]/i", "h3", $str);
?>

また

<?php
     // Fill $str with the html;

     str_replace("h2", "h3", $str);      
?>

これで問題なく動作するはずです。$matches パラメータを preg_replace に追加すると、行われた変更の数も追跡されます。ここで、ループを使用して、どの要素を置き換える必要があるかを制御できますが、上記の関数は h2 のすべての出現を検出します。

また、数値を交換してより便利な関数を作成できるように、正規表現を過度に複雑にしました。「/(h2)/i」を使用するだけでもうまくいきます。

したがって、コードは正しい方法でループを実装して、すべてのタグを置き換えないようにする必要があります。また、関数が h2 だけを処理するか、より柔軟にする必要があるかを決定する必要があります。

最後に、str_replace は preg_replace よりも高速であるため、必要な編集がこれだけである場合は、str_replace をお勧めします。

于 2012-11-19T18:34:51.890 に答える
1

これにはサーバー側の HTML パーサーを使用する必要はありません。これは完全にやり過ぎです。次の例は、特定の HTML 構造によって明らかに壊れる可能性がありますが、ほとんどのマークアップではまったく問題がなく、サーバー側の HTML パーサーよりもはるかに最適です。

$html = '
<h2>My text one</h2>
<h2>My text two</h2>
text ...
<h2>My text three</h2>
';

preg_match_all

/// the following preg match will find all <h2> mark-up, even if 
/// the content of the h2 splits over new lines - due to the `s` switch
/// It is a non-greedy match too - thanks to the `.+?` so it shouldn't 
/// have problems with spanning over more than one h2 tag. It will only
/// really break down if you have a h2 as a descendant of a h2 - which
/// would be illegal html - or if you have a `>` in one of your h2's
/// attributes i.e. <h2 title="this>will break">Text</h2> which again
/// is illegal as they should be encoded.

preg_match_all(
  '#(<)h2([^>]*>.+?</)h2(>)#is',
  $html,
  $matches,
  PREG_OFFSET_CAPTURE|PREG_SET_ORDER
);

交換して再構築

/// Because you wanted to only replace the 2nd item use the following. 
/// You could however make this code as general or as specific as you wanted.
/// The following works because the surrounding content for the found 
/// $matches was stored using the grouping brackets in the regular 
/// expression. This means you could easily change the regexp, and the 
/// following code would still work.

/// to get a better understanding of what is going on it would be best
/// to `echo '<xmp>';print_r( $matches );echo '/<xmp>';`

if ( isset($matches[1][0]) ) {
  $html = substr( $html, 0, $matches[1][0][1] ) . 
          $matches[1][1][0] . 'h3' . 
          $matches[1][2][0] . 'h3' . 
          $matches[1][3][0] .
          substr( $html, $matches[1][0][1] + strlen($matches[1][0][0]) );
}

多くの人がこの変更にクライアント側 JavaScript を使用すると述べている理由がわかりません。PHP は、PHP: Hypertext Preprocessorハイパーテキストを前処理するように設計されていることを表しています。OPはPHP関数についてのみ言及し、この投稿にPHPのタグを付けたので、クライアント側につながるものは何もありません.

サーバー側からの処理を軽減するために可能な場合はクライアント側を使用できますが、これは見出しなどのコア構造タグには推奨されません。これは、スクリーン リーダーや検索エンジン ボットによって依存されます。せいぜいクライアント側の JavaScript を使用して、ユーザー エクスペリエンスを向上させる必要があります。それを使用してサイトの機能を大幅に強化する場合は、完全なユーザーベースがそれをサポートしていることを確認してください。

ただし、Node.jsJSDOMについて言及した人がいたとしたら、私は喜んで同意したでしょう。

于 2012-11-19T19:00:50.160 に答える