0

私の問題は、この例のように文字列内srcのタグの値を置き換える方法<script>です (まあ、タグ内のプロパティのより一般的なシナリオでこれが必要です):

$data = <<<EOD
<script language="javascript" src= "../tests/ajax-navigation.js"></script>
...
<img src="../404.jpg" alt="404">
...
EOD;

私はphpでこの関数を使用しました:

class Search{
 public static function replaceProperty($data, $start, $end, $property, $alias, $limit = -1){
   //get blocks formed as: $start $property = "..." $end or $start $property = '...' $end
   $pattern = "!(".$start."){1}(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)(".$end."){1}!s";
   $data = \preg_replace($pattern, "{$start}\${2}{$property}=\"{$alias}\"\${4}{$end}", $data, $limit);
   return $data;
 }
}

私はこのように呼んだ:

 $data = Search::replaceProperty($data, "<script", ">", "src", $alias);

本当に奇妙なのは、タグ<script>とタグの両方<img>が変更されることです! もちろん、私はそれを次のように呼び出すことができます

 $data = Search::replaceProperty($data, "<script", "</script>", "src", $alias);

しかし、これは一般的なケースには答えません!

正規表現でいくつかの点を明確にするために:

私。検索する実際の文字列は次のとおりです。

$data = <<<EOD
<script language="javascript" src= "../tests/ajax-navigation.js"></script>
...
<script language="javascript" type="text/javascript">
...
<img src="../404.jpg" alt="404">
...
EOD;

ii. 正規表現$pattern = "!(".$start."){1}(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)(".$end."){1}!s";または最も単純な形式$pattern = "%".$start."(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)".$end."%s";(わずか 3 つのサブパターン) では、最初のパターン<script>が期待どおりに識別されますが、... 2 番目のパターンを取得し、最初のパターン<script>で終了し、間にあるプロパティを変更します!><img>src

iii. sパターンの末尾にあるメタ文字を削除する$pattern = "%".$start."(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)".$end."%";と、期待どおりに動作しますが、タグが次のように壊れていると失敗します。

<script language="javascript" src= "../tests/ajax-navigation.js"
></script>

iv。もちろん、私の意図は、srcプロパティの値を削除するのではなく、置き換えることです。

これらが私の質問を明確にすることを願っています。

4

3 に答える 3

0

preg_match_all を使用して特定の要素をすべて検索するために使用したコードを次に示します。

$arr = array();
preg_match_all("%[<]script.*?[>](.*?)[<][\/]script[>]%",$f, $arr, PREG_OFFSET_CAPTURE);
var_dump($arr);

または preg_replace を使用:

$a = preg_replace("%[<]H3.*?[>].*?[<][\/]H3[>]%", "", $a);

<関数に を渡す代わりに、>[<]$start を配置して使用した構文に従って、すべて preg_match を試してください<。また、% の後にそれぞれの preg_match オプションを使用するか、前に strtolower を使用してすべてのデータを変換して、大文字と小文字が区別されないようにしてください。これが機能する場合は、残りを自分で理解できると確信しています。

于 2013-08-01T21:48:08.443 に答える
0

私が言ったように、私は使用しますDOMDocument()が、ここに正規表現による答えがあります:

class Search{

public function __construct(){}

public static function replaceProperty($data, $tag, $property, $alias, $limit = -1){
   //get blocks formed as: <$tag...$property=["|']...["|']...[/>|>]
   $pattern = '%<\s*'.$tag.'(\s+(\w+)(\s*\=\s*(\'|"|)(.*?)\\4\s*)?)*\s*(\/>|>)%s';
   $result = \preg_match_all($pattern, $data, $matches, PREG_PATTERN_ORDER);
   if(!empty($result)){
      $search = array();
      $replace = array();
      //found them at index = 0!
      foreach($matches[0] as $i=>$found){
         if(($limit >= 0) && ($i >= $limit))
            break;
         if(isset($matches[2]) && isset($matches[5]) && $matches[2][$i] == $property){
            $search[] = $found;
            $replace[] = \str_replace($matches[5][$i], $alias, $found);
         }
      }
      $data = \str_replace($search, $replace, $data);
   }
   return $data;
}
}

そして次のように呼び出されます:

$data = Search::replaceProperty($data, "script", "src", $alias);

この投稿の Emanuele Del Grande の回答を使用しました。これは、このような投稿の複製である可能性があります。
ありがとう。

于 2013-08-08T14:02:06.693 に答える
0

この行を変更します。

 public static function replaceProperty($data, $start, $end, $property, $alias, $limit = -1){

これに:

 public static function replaceProperty($data, $start, $end, $property, $alias='', $limit = -1){

$alias パラメータにデフォルト値の '' を追加します。

また、 preg_replace の前のバックスラッシュがそこで何をしているのかわかりません。それも取り除かなければなりませんでした。

于 2013-08-01T21:43:13.947 に答える