2

ローカルのsrcを照合し、Web経由でロードする必要があります。例:

src="/js/my.js">

になる:

src="http://cdn.example.com/js/my.js">

これは私が今持っているものです:

if (!preg_match("#<script(.+?) src=\"http#i",$page)){ 
$page = preg_replace("#<script(.+?) src=\"#is", "<script$1 src=\"$workingUrl", $page); 
}

次のようなものに遭遇すると、正常に動作します。

<script type='text/javascript' src='/wp-includes/js/jquery/jquery.js?ver=1.8.3'></script>

次のようなものに遭遇すると失敗します。

<script language="JavaScript">
window.moveTo(0,0);
window.resizeTo(screen.width,screen.height);
</script>

スクリプトタグにsrcが含まれていない場合は、最初の画像タグのsrcを検索し、そのURLを切り替えます。

スクリプトタグのみで一致を終了させる方法や、置換をより適切に実行する方法を知る必要があります。

4

2 に答える 2

2

DOMDocument :: loadHTMLの使用を禁止し、代わりにDOMを使用して、の使用を削除します。そして、最初の>までのすべてをフォールバックとして受け入れるだけで、おそらくうまく機能します(ただし、理論的には、>を含む<script>の他の属性が存在する可能性があるため、完全ではありません)。

使用:

#<script([^>]+?) src=\"#is

代わりに、パターンは<scriptの後の最初の>に遭遇すると、パターンの一致を停止します。

于 2013-01-10T13:15:08.890 に答える
2

間違いなくDOMパーサーを使用してください。XpathとDOMDocumentは、次のようなスクリプトタグをクリーンかつ確実に置き換えます。

  1. src属性を持ち、
  2. src属性はhttpで始まりません。

xpathクエリ式をさらに開発して、先頭のhttp部分文字列をチェックすることもできましたが、構文を増やして怖がらせたくありませんでした。

コード:(デモ

$html = <<<HTML
<html>
<head>
<script type='text/javascript' src='/wp-includes/js/jquery/jquery.js?ver=1.8.3'></script>
<script language="JavaScript">
window.moveTo(0,0);
window.resizeTo(screen.width,screen.height);
</script>
</head>
</html>
HTML;

$workingUrl = 'https://www.example.com';

$dom = new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query("//script[@src]") as $node) {
    if (strpos($node->getAttribute('src'), 'http') !== 0) {
        $node->setAttribute('src', $workingUrl);        
    }
}
echo $dom->saveHTML();

出力:

<html>
<head>
<script type="text/javascript" src="https://www.example.com"></script>
<script language="JavaScript">
window.moveTo(0,0);
window.resizeTo(screen.width,screen.height);
</script>
</head>
</html>

わずかに「怖い」xpathバージョンのみ:(デモ

$dom = new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query("//script[@src and not(starts-with(@src,'http'))]") as $node) {
    $node->setAttribute('src', $workingUrl);        
}
echo $dom->saveHTML();
于 2019-11-22T08:44:03.760 に答える