2012-01-22 80 views
0

当人们询问如何从网页内容/文本等中获取并提取图像实际URL时,我看到了很多答案,但是,在我的数据库中,不幸的是,我有这个语法:php匹配模式从文本文件中获取图像

<img class="photo" src="http://domain.com/image.jpg" alt="alt goes here" /> 

因此,典型的方式$pattern = '/src=["|\']([^"|\']+)/is';不会在我的情况,由于那些"工作... 一直在尝试了几个小时,我必须做一些非常非常错误的... 任何帮助非常感激!

+0

你为什么不先'str_replace'所有这一切,然后用你的正则表达式? –

+0

因为'str_replace'不安全? **为什么即使在PHP中编写HTML解码器和解析器时,也只是通过调用正确的函数来实现它而已?** – Christian

+0

@ChristianSciberras - 看起来像您误解了我:我说他应该[首先运行'str_replace'他的字符串](http://codepad.org/QekMM6IG),然后使用他的正则表达式! –

回答

1

不要使用正则表达式!

使用XML/DOM库,如Simple HTML DOM

顺便说一句,你正在寻找的正则表达式,

$pattern = '/src=(["\'])(.+)(?=\1)/i'; 

测试用例(可选):

下面是一个简单的程序进行测试。显然,您首先需要使用htmlspecialchars_decode()来从实体格式对其进行解码。

$str = array(
    "<script type=\"text/javascript\" src=\"script.js\"></script>", 
    "<script type=\"text/javascript\" src='script.js'></script>", 
    '<script type="text/javascript" src="script.js"></script>', 
    '<script type="text/javascript" src=\'script.js\'></script>', 
); 
$pattern = '/src=(["\'])(.+)(?=\1)/i'; 

foreach($str as $s){ 
    preg_match($pattern, $s, $m); 
    echo $m[2], PHP_EOL; 
} 

输出

script.js 
script.js 
script.js 
script.js 
+0

@mario我明白了,我的错误。认为这是另一个正则表达式fanboyism的例子。 – Christian

+0

Okie。根据OP更新问题。 @mario。 –

+0

谢谢所有人,我遵循你对htmlspecialchars_decode的建议,最后我有有效的图像URLS! 'if(preg_match($ pattern2,htmlspecialchars_decode($ ck ['post']),$ found_img))' – Andrew

0

你可以在这里测试正则表达式:

http://gskinner.com/RegExr/

什么是不工作?

+0

首先,双引号转换为'"',就像其他特殊字符一样,其次,'preg_match' *绝对不是这里的解决方案*。 – Christian

+0

@ChristianSciberras,好的,我没有看到原始文章中的编码。很好的答案! – mowwwalker

2

首先,'常用的方法'是使用HTML/XML解析器,而不是正则表达式。

其次,你有什么是编码为HTML文本,它闻起来很糟糕的原因有两个HTML代码:

  • 它不是HTML更多(为什么它编码的HTML文本时,它实际上是在HTML代码) ?
  • 在将代码写入数据库之前,不应对HTML进行编码,而应将其写入用户。

带着这两个问题放在一边,你需要做的是htmlspecialchars_decode()的东西,并使之通过HTML解析器:

$stuff = '&lt;img class=&quot;photo&quot; src=&quot;http://domain.com/image.jpg&quot; alt=&quot;alt goes here&quot; /&gt;'; 
$code = htmlspecialchars_decode($stuff, ENT_QUOTES); 
$xml = simplexml_load_string($code); 

这就是说,对我来说这听起来像一个黑客修复严重书面代码。但首先它可能有一个合理的原因。

+0

' '< IMG类= "相片" SRC = " http://domain.com/image.jpg " ALT = " ALT到这里"/>';'是伪样品的方式来显示千个不同的网址被发现在我的数据库中。我的问题是孤立的实际图像的位置,每次 – Andrew

+0

@Andrew我的观点是,你在你的数据库中的东西没有做到正确。首先,不要将HTML编码为HTML文本,其次,当数据分成列和表而不是数据斑点时,数据库的效果最好。尽管如此,你可以使用我的代码来完成你想要的任务。 – Christian

+0

非常感谢大家的建议,@Christian Sciberras感谢你,它不是我的代码,我不是一个大师,只是一个新手试图修复一些买不到的东西...... Blame Invision IPB为这种类型的db内容,所有这些都发生在授权用户发布html(允许直接在帖子中发布html)的情况下发生。我有这样的情况,就像那样,不能改变它。必须处理它,并找到能够识别图像URL的正则表达式:) – Andrew