0

私はプログラミングに c と c# を使用していましたが、サードパーティの正規表現ライブラリを使用してリンク パターンを識別しています。しかし、昨日、何らかの理由で、代わりに php を使用するように依頼されました。私はphpの正規表現に慣れていませんが、試してみましたが、期待どおりの結果が得られませんでした。次の形式の画像 src のリンクを抽出して置き換える必要があります。

<img src="/a/b/c/d/binary/capture.php?id=main:slave:demo.jpg"/>

src のパスのみが必要ですが、引用符は double または single である可能性があり、id はケースごとに異なる可能性があります (ここでは main:slave:demo.jpg です)。

次のコードを試します

 $searchfor = '/src="(.*?)binary\/capture.php?id=(.+?)"/';
 $matches = array();
 while ( preg_match($searchfor, $stringtoreplace, $matches) == 1 ) {
   // here if mataches found, replace the source text and search again
   $stringtoreplace= str_replace($matches, 'whatever', $stringtoreplace);
 }

しかし、それは機能しません。上記のコードで見逃しているものや間違いはありますか?

より具体的には、srcを次のように指定するイメージタグがあるとしましょう

  <img src="ANY_THING/binary/capture.php?id=main:slave:demo.jpg"/>

ここで、ANY_THING は何でもかまいません。"/binary/capture.php?id=" はすべての場合に固定されます。"id=" の後の文字列はパターン "main:slave:demo.jpg" であり、コロンの前の文字列は次のようになります。場合によっては、jpeg の名前もさまざまです。私はそれが次のように置き換えられることを期待します

  <img src="/main/slave/demo.jpg"/>

特定の限られた時間にのみ php スクリプトを変更する権利があるため、変更を行う前にコードをデバッグしたいと考えています。ありがとう。

4

1 に答える 1

0

まず第一に、ご存じかもしれませんが、正規表現を使用して HTML を操作するべきではありません

ただし、試してください:

$stringtoreplace = '<img src="/a/b/c/d/binary/capture.php?id=main:slave:demo.jpg"/>';
$new_str = preg_replace_callback(
    // The regex to match
    '/<img(.*?)src="([^"]+)"(.*?)>/i',
    function($matches) { // callback
        parse_str(parse_url($matches[2], PHP_URL_QUERY), $queries); // convert query strings to array
        $matches[2] = '/'.str_replace(':', '/', $queries['id']); // replace the url
        return '<img'.$matches[1].'src="'.$matches[2].'"'.$matches[3].'>'; // return the replacement
    },
    $stringtoreplace // str to replace
);
var_dump($new_str);
于 2013-01-20T00:51:57.457 に答える