多くの人が正規表現で犯す間違いは、すべてを行う巨大な正規表現を 1 つ書こうとすることです。この方法は狂気です。(問題によっては) 不可能であるだけでなく、複雑で、醜く、壊れやすいものになります。物事を扱いやすいステップに分割する方がはるかに優れています。
<img>内のタグだけを置き換えたいとおっしゃっていますが、タグが有効な<body>場所は 内だけなので無視します。の外側のタグを本当に無視する必要がある場合は、全体をさらに別のタグでラップして、入力から を抜き出すことができます。<img><body><img><body>preg_replace_callback<body>
したがって、私が採用したアプローチは、2 つの正規表現を使用することです。1 つは<img>入力内のタグのすべてのインスタンスに一致するもので、もう 1 つは属性を置き換えるaltものです。これを達成するために、私は以下を使用しますpreg_replace_callback:
$output = preg_replace_callback( '/<img .*?>/', function($matches) {
return preg_replace( '/\bsrc\s*=\s*[\'"](.*?)[\'"]/',
'data-image="$1"', $matches[0] );
}, $input );
?反復メタ文字での遅延量指定子の使用に注意してください。これがないと*、2 つの連続<img>するタグが 1 つの大きなタグとして扱われ、これは望ましくありません。置換関数では、属性を探してsrc属性に置き換えdata-imageます。
このソリューションが失敗する場所は次のとおりです。
- 引用符で区切られた
src属性 ( <img src="what's_up_doc.jpg">) またはその逆にアポストロフィがある場合。これを解決する必要がある場合は、二重引用符で囲まれた属性を処理するための正規表現と、単一引用符で囲まれた属性を処理するための正規表現の 2 つの異なる置換正規表現が必要になります。
<img>タグが複数行にまたがる場合。これが問題になる場合は、外側の正規表現で[^]代わりに使用して、改行を含む.すべてに一致させることができます。