0

我有大量的网页存储在 MySQL 数据库中。

这些页面中的大多数至少包含一个(有时是两个)这样的条目......

<a href="http://first-url-which-always-ends-with-a-slash/">
  <img src="http://second-different-url-which-always-ends-with.jpg" />
</a>

我想设置一个小 php 循环来遍历所有条目,用该条目的第二个 url 的副本替换第一个 url。

我如何使用 preg 来:

  1. 从图像标签中找到第二个 url
  2. 将 a 标签中的第一个 url 替换为第二个 url 的副本

这可能吗?

4

3 回答 3

1

看到这个网址

PHP预匹配/替换?

另见:- http://php.net/manual/en/function.preg-replace.php

$qp = qp($html);
foreach ($qp->find("img") as $img) {
    $img->attr("title", $img->attr("alt"));
}
print $qp->writeHTML();

尽管在这种简单的情况下诉诸正则表达式可能是可行的:

preg_replace('#(<img\s[^>]*)(\balt=)("[^"]+")#', '$1$2$3 title=$3', $h);

(使用 preg_replace_callback 来确保不存在 title= 属性会更有意义。)

于 2012-08-17T09:51:07.540 回答
0

您可以执行以下操作:

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$source = "<a href=\"http://first-url-which-always-ends-with-a-slash/\">
  <img src=\"http://second-different-url-which-always-ends-with.jpg\" />
</a>";
$dom->loadHTML($source);
$tags = $dom->getElementsByTagName('a');

foreach ($tags as $tag) {
  $atag = $tag->getAttribute('href');  
  $imgTag = $dom->getElementsByTagName('img');
  foreach ($imgTag as $img) {        
    $img->setAttribute('src', $atag);
    echo $img->getAttribute('src');
  }
}
于 2012-08-17T10:41:14.213 回答
0

感谢您的建议,我可以看到它们比使用 Preg 更好。

即便如此,我终于像这样解决了我自己的问题......

$result = mysql_query($select);
while ($frow = mysql_fetch_array($result)) {
    $page_content = $frow['page_content'];

    preg_match("#<img\s+src\s*=\s*([\"']+http://[^\"']*\.jpg[\"']+)#i", $page_content, $matches1);
    print_r($matches1);
    $imageURL = $matches1[1] ; 

    preg_match("#<a\s+(?:[^\"'>]+|\"[^\"]*\"|'[^']*')*href\s*=\s(\"http://[^\"]+/\"|'http://[^']+/')#i", $page_content, $matches2);
    print_r( $matches2 );  
    $linkURL = $matches2[1] ;

    $finalpage=str_replace($linkURL, $imageURL, $page_content) ;
}
于 2012-08-22T11:15:22.137 回答