0

次の基準に基づいて、img タグのインライン CSS を変更したいと考えています。

  1. float:left または float:right が含まれている場合は変更しないでください
  2. それ以外の場合は、display:block を追加します。
  3. また、margin CSS 属性を変更します。水平マージンを自動に変更し、垂直マージンを保持します。

たとえば、コードが次のようになっているとします。

<img src="ex1.jpg" style="margin:5px 5px;float:left;" />

その後、変更は行われません。ただし、コードが次の場合:

<img src="ex2.jpg" style="margin:5px 175px;" />

次に、次のように変更する必要があります。

<img src="ex2.jpg" style="display:block;margin:5px auto;" />

またはこのようなもの:

<img src="ex3.jpg" style="margin-top:5px; margin-left:5px;" />

次に、次のように変更する必要があります。

<img src="ex3.jpg" style="display:block;margin-top:5px margin-left:auto;" />

編集: img タグの変更は、CMS で取得した HTML コードで行う必要があります。

4

4 に答える 4

2

このパターンを試して、それらに何も存在<img/>せずに一致させます。float

<img(?![^<>]+?\bfloat\s*:\s*(?:left|right))[^<>]+>

説明

<img(?![^<>]+?\bfloat\s*:\s*(?:left|right))[^<>]+>

<img文字を文字通り一致させ<imgます。この位置から始まる以下の正規表現に一致することは不可能であることを主張します (否定先読み) (?![^<>]+?\bfloat\s*:\s*(?:left|right))。リストに存在しない単一の文字に一致します<> [^<>]+?。1 回から無制限の回数の間で、できるだけ少ない回数で、必要に応じて拡張します (遅延)+? 単語境界で位置をアサートし\bます。float文字を文字通り一致させfloatます。whitespace character(スペース、タブ、および改行) である単一の文字に一致します\s*。ゼロ回から無制限の回数まで、必要に応じて何度でもお返しします (貪欲) *. :文字を文字通り一致させ:ます。whitespace character(スペース、タブ、および改行) である単一の文字に一致します。\s*. ゼロ回から無制限の回数まで、必要に応じて何度でもお返しします (貪欲) *. 以下の正規表現に一致します(?:left|right)。以下のいずれかの正規表現に一致します (これが失敗した場合にのみ、次の代替を試行します) leftleft文字を文字通り一致させleftます。または、以下の正規表現番号 2 に一致します (これが一致しない場合、グループ全体が失敗します) rightright文字を文字通り一致させrightます。リストに存在しない単一の文字に一致します<> [^<>]+。1回から無制限まで、何度でも、必要に応じてお返しします(貪欲)+>文字を文字通り一致させ>ます。次に、カスタム関数を準備して残りを処理します。

于 2012-11-21T14:20:09.057 に答える
1

編集:

少し考えた後、img タグの素敵なリストではなく、サンプル html の大きな塊を使用した例を見る方が役立つでしょう。以下の更新されたコードと出力を参照してください。

ルールは非常に単純で、必要に応じて preg_replace を使用して簡単に実行でき、正規表現エンジンの呼び出しを保存するために strpos を使用してチェックを行うことができます。ご不明な点がございましたら、お知らせください。

出力:

<html>
  <head></head>
  <body>
    <p> LOLOLOLOLOLOLOL </p>
    <img src="ex1.jpg" style="margin:5px 5px;float:left;" />
    <p> LOLOLOLOLOLOLOL </p>
    <img src="ex2.jpg" style="display:block;margin:5px auto;" />
    <p> LOLOLOLOLOLOLOL </p>
    <img src="ex3.jpg" style="display:block;margin-top:5px; margin-left:auto;" />
    <p> LOLOLOLOLOLOLOL </p>
  </body>
<html>

コード:

<?php

// sample html blob
$sample_html = '
  <html>
    <head></head>
    <body>
      <p> LOLOLOLOLOLOLOL </p>
      <img src="ex1.jpg" style="margin:5px 5px;float:left;" />
      <p> LOLOLOLOLOLOLOL </p>
      <img src="ex2.jpg" style="margin:5px 175px;" />
      <p> LOLOLOLOLOLOLOL </p>
      <img src="ex3.jpg" style="margin-top:5px; margin-left:5px;" />
      <p> LOLOLOLOLOLOLOL </p>
    </body>
  <html>';

// grab all the matches for img tags and exit if there aren't any
if(!preg_match_all('/<img.*\/>/i', $sample_html, $matches))
  exit("Found no img tags that need fixing\n");

// check out all the image tags we found (stored in index 0)
print_r($matches);

// iterate through the results and run replaces where needed
foreach($matches[0] as $string){
  // keep this for later so that we can replace the original with the fixed one
  $original_string = $string;

  // no need to invoke the regex engine if we can just do a quick search. so here
  // we do nothing if it contains a float.
  if(false !=- strpos($string, 'float:')){
    continue;
  } 

  // inject the display:block if it doesn't already exist
  if(false === strpos($string, 'display:block;')){
    $string = preg_replace('/(<img.*style=")(.* \/>)/i', '$1display:block;$2', $string);
  }

  // preg_replace only replaces stuff when it matches a pattern so it's safe to
  // just run even if it wont do anything.

  // replace margin left if in margin:vert horiz; form
  $string = preg_replace('/(margin:[\s0-9]+px)\s[0-9]+px;/', "$1 auto;", $string);

  // replace margin-left value to auto
  $string = preg_replace('/(margin-left:).*;/', "$1auto;", $string);

  // now replace the original occurence in the html with the fix
  $sample_html = str_replace($original_string, $string, $sample_html);
}

// bam done
echo "{$sample_html}\n";

?>
于 2012-11-21T14:35:24.703 に答える
0

preg_match();
ここでphp.netへのクイックリンクを使用することを検討してください: http://php.net/manual/en/function.preg-match.php。そこで例を見ることができます。

于 2012-11-21T14:28:37.967 に答える
0

あなたの定義からの迅速で汚れた機能:

function modify_img_css($html) {
    if (strpos($html, 'float:left') !== false || strpos($html, 'float:right') !== false) {
        return $html;
    }
    $html = str_replace('style="', 'style="display:block;', $html);
    if (strpos($html, 'margin-left:') !== false) {
        $html = preg_replace('/margin\-left:[^;]+;/', 'margin-left:auto;', $html);
    }
    if (strpos($html, 'margin:') !== false) {
        $html = preg_replace('/(margin:\s*\S+\s+)\S+;/', '\1auto;', $html);
    }
    return $html;
}
于 2012-11-21T14:29:41.630 に答える