これにはサーバー側の 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.jsとJSDOMについて言及した人がいたとしたら、私は喜んで同意したでしょう。