5

WYSIWYG エディターを古いバージョンから最新のものにアップグレードしました。画像の寸法が保存される方法には違いがあります。イメージ タグに幅と高さのパラメーターを追加するために使用される古いバージョンのエディター。新しいエディターはスタイル パラメーターを作成し、幅と高さをスタイルとして追加します。

<a>タグをラップできるように使用する preg_replace 関数があり<img>ます。

新しいエディターは幅と高さをスタイル パラメーターに保存するため、現在の preg_replace は機能しなくなりました。

プレグ交換:

$Content = preg_replace('#<img(.*?)src="([^"]*/)?(([^"/]*)\.[^"]*)"([^>]*?)>((?!</a>))#', '<a rel="group" class="fancybox fancy" title="" href="$2$3"><img$1src="$2$3"></a>', $Content);

知っておくと便利な場合、新しいエディターは次のような画像を保存します。

<img alt="" src="" style="" />

古いエディタでは、次のような画像が保存されていました。

<img src="" width="404" height="228" alt="" />

完全なスタイル要素もコピーするように preg_replace をリファクタリングするにはどうすればよいですか? 後方互換性も素晴らしいでしょう。

御時間ありがとうございます :)

4

3 に答える 3

8

これを試して:

$regex = '#<img([^>]*) src="([^"/]*/?[^".]*\.[^"]*)"([^>]*)>((?!</a>))#';
$replace = '<a rel="group" class="fancybox fancy" title="" href="$2"><img$1 src="$2"$3></a>';
$Content = preg_replace($regex, $replace, $Content);
于 2013-06-07T16:50:33.357 に答える
7

正規表現をさらに単純化することができます。入力が正しいと予想される場合はこのソリューションを使用できます。それ以外の場合は、html パーサーを使用するだけです。

$string = 'Some text <img alt="bar" title="foo" src="http://example.com/example.jpg" style="width:200px;height:400px;" /> Some text';

$new_string = preg_replace('#<img.+?src="([^"]*)".*?/?>#i', '<a href="$1">$0</a>', $string);
var_dump($new_string);

説明:

  • <img: マッチ<img
  • .+?: 何にでも 1 回以上一致する (貪欲でない)
  • src=": マッチsrc="
  • ([^"]*)": 0 回以上を除くすべてに一致し、それをグループ化します
  • ".*?/?>: 一致してからor"まで/>>
  • imodifier : 大文字と小文字を区別しない一致

を使いたく<img.+?src\s*=\s*"([^"]*)".*?/?>なるかもしれませんが、 の前後にスペースがあるかもしれません=

オンラインデモ

于 2013-06-07T16:46:00.493 に答える
2

Spudley がコメントで述べたように、特にエディターが画像を追加する方法を制御できない場合は、DOM パーサーを真剣に検討する必要があります (ただし、エディターを変更してリンクを追加すると、それがどちらであるかによっては、さらに簡単になります – 私は個人的にTinyMCEをハックしてそれを実行しようとはしないかもしれませんが、 wysihtml5のためにそれを検討するかもしれません)。

とにかく脱線します。ここでのこのアプローチでは、正規表現を可能な限り単純化してみてください。属性自体が何であるかを気にする必要はあり<a>ません (それらを保持している限り)。

だから、このようなことを試してみてください(私はこの式をテストしましたが、PHPではなくPythonで、YMMVです):

 preg_replace('<img(.*)src="([^ "]*)"([^>]*)>', '<a href="$2"><img$1src="$2"$3></a>', $whatever_your_string_is);
于 2013-06-07T16:46:45.433 に答える