2016-07-10 3 views
-3

PHPを使ってHTML内のすべてのsrcパスを置き換えたい。RegexがhtmlではSrc属性を見つけられるが、スクリプトタグ内では見つからない

$str = preg_replace_callback('@src=\s*(?:["|\'])?([^ >"\']+)@i',array($this, 'html_src'), $str); 

このコードは

ようなHTML内のすべてのSRCを見つけて、私は絶対URLとそれらのURLを交換してください。

しかし、これは問題であるため、この正規表現でタグ内のsrcを検索したくありません。

私がscriptタグ内でsrcを見つけてurlで置き換えたような場合、jsはエラーを返します。

正規表現を拡張してもらえますか?

+4

あなたの質問に厳密には当てはまらないが、これを読んでください:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Tibrogargan

+0

私はたくさんの回答を読んでみても、すでにそれをしようとしていますが、私にとってはうまくいきません私はこの@ [^ \。]を試してみてください。src = \ s *(?:["| \ '])?([^>" \'] +)@ i – Mubbashar

+2

リンクした質問のポイントは、 htmlでの使用にはしばしば不適切です。 XMLパーサを使用し、src属性を含む可能性のあるすべてのタグを確認します。 – Tibrogargan

答えて

1

代わりにパーサを使用します。

<?php 

$data = <<<DATA 
This is an image source: <img src='/images/football.png'> 
This one is inside script tags: 
<script>function e(a){var c=b.createElement("script");c.src=a,c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}</script> 
DATA; 

$dom = new DOMDocument(); 
$dom->loadHTML($data); 

$xpath = new DOMXPath($dom); 
$images = $xpath->query("//img"); 
foreach ($images as $image) { 
    $image->setAttribute('src', 'some_new_url_here'); 
} 
echo $dom->saveHTML(); 
?> 

a demo on ideone.comを参照してください。


代替正規表現を表示するには、 PCREが提供する (*SKIP)(*FAIL)メカニズムを使用できます。アイデアは、あなたが(すなわち <script>タグ)をしたい、その後、全体の一致からそれらを除外しないすべてのものと一致することです:あなたたとえば

not_this|forget_this(*SKIP)(*FAIL|but_keep_this 

を、これはに降りてくる:

<script>[\s\S]*?</script>(*SKIP)(*FAIL) 
| 
\bsrc=(['"]).+?\1 

a demo for this one on regex101.comを参照してください。


これには非常に頻繁に議論されているいくつかの欠陥があり、最も好きな回答はbeing this oneです。

関連する問題