0

我使用 c 和 c# 进行编程,并且正在使用一些第三方正则表达式库来识别链接模式。但是昨天,由于某种原因,有人要求我改用 php。我不熟悉 php 正则表达式,但我尝试了,没有得到预期的结果。我必须提取并替换以下形式的图像 src 的链接:

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

我只想要 src 中的路径,但引号可以是双引号或单引号,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 回答