【问题标题】:Regular expression, parsing img src content and replacing it with another links正则表达式,解析img src内容并用另一个链接替换
【发布时间】:2014-01-27 20:07:01
【问题描述】:

我需要在我的网站上创建下一个功能:用户写一篇文章并在其中附加图像,图像通常不存储在本地主机上。我需要将此图像下载到 localhost 并替换指向 localhost 图像的链接。

例如:

<img ... src="http://bob.com/img/image1.png" ... >
<img ... src="http://bob.com/img/image2.png" .... >

脚本会找到src的内容,下载图片并像这样替换它:

<img ... src="/images/image1.png" ... >
<img ... src="/images/image2.png" .... >

我了解如何从代码中解析所有src

$subject = # i will put there article content (with img tags etc)
$result = array();
preg_match("/<img.*?src="(.*?)".*?>/", $subject, $result);

现在$result 数组将包含所有图片链接。好的。现在我有一些问题。

1) 如果我使用preg_replace,它会帮助我解决这个任务吗?在我看来不是,因为preg_replace 将立即替换内容(所以我无法下载图像,创建存储在本地主机图像上的新链接并以某种方式将其设置为preg_replace 的参数,因为它还在运行)。我对这个假设是否正确?

2) 好的。我可以组成一个数组,就像我说的那样。之后,我从这个数组下载所有图像。在那之后,不知何故,我将用新图像替换所有旧图像。我认为这更现实。我对吗?

类似的东西:

$subject = # i will put there article content (with img tags etc)
$result = array();
preg_match("/<img.*?src="(.*?)".*?>/", $subject, $result);

foreach($result as $src)
{
 $new_src = downloadImage($src);
 # somehow replace old image with new image there. How?
}

3)如果我使用第二种方法,我该如何替换链接?

【问题讨论】:

  • 你试过Php::DomDocument 吗?操作 DOM 比 Regex 容易得多,而且是 OOP ;)
  • 嗯。那你能举个例子吗?
  • 在标题中看到“正则表达式”后跟“解析”。畏缩了。
  • 试试 DOM,not regexes.

标签: php html regex image


【解决方案1】:

一个如何操作 HTML 图像标签的 PHP DOMDocument 示例。

$dom=new DOMDocument();
$dom->loadHTML($html_src);
$imgs = $dom->getElementsByTagName('img');
foreach($imgs as $img){

    $img_src = $img->getAttribute('src'); // will give you the src String

    //do something here

    $img->setAttribute('src',$new_src); // change your src= value

}

当属性存在时,您可以使用setAttribute 操作所有内容。

如果你想确定 src 已设置,那么你可以使用 hasAttribute

【讨论】:

  • 1 秒。 $html_src - 这个变量的内容是什么? Php::DomDocument 将与变量一起使用吗?我的意思是...用户写了一篇文章,我会将它保存在一些变量中。我可以通过Php::DomDocument 使用这个变量吗?好吧,第二个问题不太重要,如果我知道第一个问题的答案。
  • 在我的示例中,$html_src 是页面中的 html 内容,向您展示如何加载 html 源代码
  • 好的。但是我需要交换用户输入的文本中的链接。可能吗?像这样:$text = $_POST['article_text']; $dom=new DOMDocument(); $dom-&gt;loadHTML($text); .... #etc
  • 是的,当您的 $_POST 变量包含 html 代码时,您可以像这样使用它,但是当您必须通过 $_POST 发送 HTML 代码时,您可能不得不过度考虑它。
  • 我正在向我的网站添加新闻/文章。我填写表单中的所有字段(标题、消息、标签等),按下发送按钮和处理程序,这将加载 $_POST 参数。怎么了?我该怎么做?
【解决方案2】:

我认为您需要preg_replace_callback,但请记住downloadImage 可能会失败。所以要优雅地处理失败(回退图像或重试队列)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多