10

PHP のソース属性 (イメージまたは任意のタグ) を置き換えるために正規表現を使用しようとしています。

私はこのような文字列を持っています:

$string2 = "<html><body><img src = 'images/test.jpg' /><img src = 'http://test.com/images/test3.jpg'/><video controls="controls" src='../videos/movie.ogg'></video></body></html>";

そして、私はそれを次のように変えたいと思います:

$string2 = "<html><body><img src = 'test.jpg' /><img src = 'test3.jpg'/><video controls="controls" src='movie.ogg'></video></body></html>";

私が試したのは次のとおりです。

$string2 = preg_replace("/src=["']([/])(.*)?["'] /", "'src=' . convert_url('$1') . ')'" , $string2);
echo htmlentities ($string2);

基本的には何も変更されず、エスケープされていない文字列に関する警告が表示されました。

$1文字列の内容を送信しませんか? ここで何が問題なのですか?

そして、convert_url の関数は、以前ここに投稿した例からのものです。

function convert_url($url)
{
    if (preg_match('#^https?://#', $url)) {
        $url = parse_url($url, PHP_URL_PATH);
    }
    return basename($url);
}

URL パスを取り除き、ファイル名だけを返すことになっています。

4

3 に答える 3

15

HTML では正規表現を使用しないでくださいDOMDocument。クラスを使用してください。

$html = "<html>
           <body>
             <img src='images/test.jpg' />
             <img src='http://test.com/images/test3.jpg'/>
             <video controls='controls' src='../videos/movie.ogg'></video>
           </body>
         </html>";

$dom = new DOMDocument;  
libxml_use_internal_errors(true);

$dom->loadHTML( $html ); 
$xpath = new DOMXPath( $dom );
libxml_clear_errors();

$doc = $dom->getElementsByTagName("html")->item(0);
$src = $xpath->query(".//@src");

foreach ( $src as $s ) {
  $s->nodeValue = array_pop( explode( "/", $s->nodeValue ) );
}

$output = $dom->saveXML( $doc );

echo $output;

次を出力します。

<html>
  <body>
    <img src="test.jpg">
    <img src="test3.jpg">
    <video controls="controls" src="movie.ogg"></video>
  </body>
</html>
于 2012-05-18T19:04:44.660 に答える
1

e修飾子を使用する必要があります。

$string = "<html><body><img src='images/test.jpg' /><img src='http://test.com/images/test3.jpg'/><video controls=\"controls\" src='../videos/movie.ogg'></video></body></html>";

$string2 = preg_replace("~src=[']([^']+)[']~e", '"src=\'" . convert_url("$1") . "\'"', $string);

修飾子を使用する場合、preg_replace の呼び出し前に解釈されないようにe、置換スクリプト フラグメントは文字列である必要があることに注意してください。

于 2012-05-18T19:38:44.720 に答える