私の問題は、この例のように文字列内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
プロパティの値を削除するのではなく、置き換えることです。
これらが私の質問を明確にすることを願っています。