正则表达式替换html页面中的url

时间:2013-08-29 16:03:48

标签: php html regex

我有一个HTML页面

<tr>
<td rowspan="7">
<a href="http://www.link1.com/" style="text-decoration: none;">
        <img src="image1.jpg" width="34" height="873" alt="" style="display:block;border:none" />
        </a>
    </td>
    <td colspan="2" rowspan="2">
        <a href='http://www.link1.com/test.php?c=1'>
        <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" />
        </a>
    </td>
<td colspan="2" rowspan="2">
        <a href='http://www.url.com/test.php?c=1'>
        <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" />
        </a>
    </td>

我想通过mytest.com?url=$link

替换href中的所有网址

我尝试:

    $messaget = preg_replace('/<a(.*)href="([^"]*)"(.*)>/','mytest.com?url=$2',$messaget);

4 个答案:

答案 0 :(得分:1)

这可能会在短期内帮助您:

preg_replace('/<a (.*)href=[\'"]([^"]*)[\'"](.*)>/', '<a $1href="mytest.com?url=$2"$3>', $messaget);

在正则表达式中,您使用的是href="...",即双引号,但在HTML中,您可以混合使用双引号和单引号。

在替换字符串中,您忘记加入$1$3

那就是说,不要使用正则表达式来解析HTML 。以下@BenLanc的答案更好,请改用它。阅读他发布的link

答案 1 :(得分:1)

Don't use regex on HTML, HTML is not regular

假设您的标记有效(如果不是,请先通过Tidy),您应该使用xpath来获取元素,然后直接更新href。例如:

<?php
$messaget = <<<XML
<tr>
  <td rowspan="7">
    <a href="http://www.link1.com/" style="text-decoration: none;">
      <img src="image1.jpg" width="34" height="873" alt="" style="display:block;border:none" />
    </a>
  </td>
  <td colspan="2" rowspan="2">
      <a href='http://www.link1.com/test.php?c=1'>
      <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" />
      </a>
  </td>
  <td colspan="2" rowspan="2">
      <a href='http://www.url.com/test.php?c=1'>
      <img src="image1.jpg" width="287" height="146" alt="" style="display:block;border:none" />
      </a>
  </td>
</tr>
XML;

$xml   = new SimpleXMLElement($messaget);

// Select all "a" tags with href attributes
$links = $xml->xpath("//a[@href]");

// Loop through the links and update the href, don't forget to url encode the original!
foreach($links as $link)
{
  $link["href"] = sprintf("mytest.com/?url=%s", urlencode($link['href']));
}

// Return your HTML with transformed hrefs!
$messaget = $xml->asXml();

答案 2 :(得分:0)

匹配网址的正则表达式:

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/  

More background info

答案 3 :(得分:0)

因为你正在使用多线源,所以不要忘记正则表达式结束时的/ m:

PHP Doc PCRE