在字符串中获取第一个图像时出现意外结果

时间:2015-12-26 21:06:58

标签: php regex preg-match

我有字符串:

<img style="max-width:100%" src="http://media.doisongphapluat.com/thumb_x670x/2015/12/26/thumon.png" alt="">

尝试获取此图片的src:

<?php 
preg_match('/<img.+src=[\'"](?P<src>.+)[\'"].*>/i', $step6[0], $image);
echo $image['src']; ?>

结果:

http://media.doisongphapluat.com/thumb_x670x/2015/12/26/thumon.png" alt="

为什么“alt =”会出现在此处以及如何将其删除?

3 个答案:

答案 0 :(得分:1)

问题是.+组中的src重复是贪婪的。因此,它会尝试匹配尽可能多的字符,从而超出 src 属性的范围。

要解决此问题,您可以通过在末尾添加问号来简单地使重复变得懒惰。.+?

More on the subject

<小时/> 所以只需将你的正则表达式改为:

<img.+src=[\'"](?P<src>.+?)[\'"].*>

See it in action

答案 1 :(得分:0)

您可以在explode();上使用src=,然后在不需要时删除剩余的=和每个"

 <?php
 $string = '<img style="max-width:100%" src="http://media.doisongphapluat.com/thumb_x670x/2015/12/26/thumon.png" alt="">';

 $string = explode("src=", $string);
 $string = explode(" ", $string[1]);
 $string = substr($string[0], 1, -1);  // remove 1st and last "
 echo $string;
 ?>

您需要确保您的HTML没有单引号,如果它符合\'

,请将其转义。

从@SeanBright的答案中删除第一个和最后一个字符的最后一行:Delete first character and last character from String PHP

$string = explode('src=', $string);已经过测试。然后,您只需要在" "后删除$string = substr($string[0], 1, -1); // remove 1st and last "

你也可以用

删除两个双重引号
$string = str_replace('"','',$string);

我认为你的正则表达式失败了,因为它只是在src =“之后得到了所有内容,但没有停留在空间。其他人在别处评论说正则表达式不是分割HTML的最可靠方法。

如果您不想explode();,可以使用strpos()substr();分割字符串

$string = '<img style="max-width:100%" src="http://media.doisongphapluat.com/thumb_x670x/2015/12/26/thumon.png" alt="">';

$pos = strpos($string,'http');
$string = substr($string,$pos, -9);  // remove last " and alt-...
echo  $string;

这只有在图像标记的结尾与您的结尾时才有效,但如果标记关闭/>,则会失败,因此您需要使用更多代码才能完全编程:

$string = '<img style="max-width:100%" src="http://media.doisongphapluat.com/thumb_x670x/2015/12/26/thumon.png" alt="">';

$pos = strpos($string,'http');   // find position of !http!
$string = substr($string,$pos);  /// get string after !http"
$len = strlen($string);          // get the length of resulting string
$pos1 = strpos($string,'"');     // find last "
$difpos = $len - $pos1;          // get the difference to use for the minus
$string = substr($string,0,-$difpos);  // get the string from 0 to "minus" position at end.
echo $string;

答案 2 :(得分:0)

尝试:

<?php
$input = "<img style='max-width:100%' src='http://media.doisongphapluat.com/thumb_x670x/2015/12/26/thumon.png' alt='' />";
$pattern = "/(http.+)'\salt/";
preg_match($pattern, $input, $matches);
echo $matches[1];
?>

它会给出:

  

http://media.doisongphapluat.com/thumb_x670x/2015/12/26/thumon.png

$matches[1]给出括号内的内容,\s用于alt之前的空格。