用php正则表达式搜索链接

时间:2013-01-19 22:37:27

标签: php regex

我使用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脚本,因此我想在进行任何修改之前调试我的代码。感谢。

1 个答案:

答案 0 :(得分:0)

首先,您可能知道regex shouldn't be used to manipulate 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);