2009-09-13 101 views
0

我想用正则表达式来替换src html属性。该HTML不是畸形的,幸运的是发生在数据库中的所有页面相同的形式 - 即替换HTML标签中的图像src?

<img src="http://x.y/z/1.png" /> 

我,如果有只有一个页面图像工作正常代码。我想知道替换多个图像的最佳方法,因为这将替换所有具有相同字符串的图像标记。

$result = $s->db_query("SELECT reviewFullText as f FROM reviews WHERE reviewsID = 155"); 
while($row = mysql_fetch_array($result)) 
{ 
    $body = stripslashes(html_entity_decode($row['f'], ENT_NOQUOTES, "UTF-8")); 
    preg_match_all('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', $body, $matches); 
    for($i=0;$i<count($matches[0]);$i++) 
    { 
     $number = preg_replace("/[^0-9]/", '', $matches[0][$i]); 
     echo preg_replace('/<img.*?(src\=[\'|"]{0,1}.*?[\'|"]{0,1})[\s|>]{1}/i', '<img src="http://x.y/a/' . $number . '.png"', $matches[0][$i]); 
    } 
} 

因此,如果页面包含两个文件,一个叫1.png和一个叫2.png脚本应该分析这些数字,并用不同的URL,如http://x.y/a/1.pnghttp://x.y/a/2.png替换它们。

我听说preg_replace_callback是这样做的最好方法,但我不知道如何得到这个工作......帮助!

+0

相似的问题到http://stackoverflow.com/questions/1416425/preg-replace-preg-match-for-href-in-html-link – TrueWill 2009-09-13 16:56:42

+0

可能的重复[你能提供一些例子,说明为什么它很难用正则表达式解析XML和HTML?](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and -html-with-a-rege) – 2011-07-09 21:01:27

+0

[RegEx match open tags but XHTML self-contained tags]可能重复(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml- self-contained-tags) – 2011-09-15 14:08:18

回答

14

Don't use regular expressions for irregular languages like HTML。改为使用parser。它会为你节省很多时间和痛苦。

# Untested code: 
$xml = new SimpleXml($xmlString); 
foreach ($xml->xpath('//img') as $imgNode) { 
    $imgNode->addAttribute('src', "http://x.y/a/" . $imgNode->getAttribute('src')); 
} 
echo $xml->asXML(); 

请注意,您将需要像DOMDocument::loadHtml(),如果你的HTML不是XHTML(即有效的XML),但这个想法是一样的。

+0

+1正则表达式完全不适合处理[X] [HT] ML。但是XPath不应该是“// img”吗? DOM getElementsByTagName也可以正常工作。我不知道在整个文档中'stripslashes(html_entity_decode())'应该在原始代码中实现什么;这只会破坏文件。 – bobince 2009-09-13 14:42:19

+0

@bobince:感谢您指出'// img'错误。我认为''stripslashes(...'部分是为'消毒'的价值(这可能是一个很好的迹象表明,文件的存储/检索需要重新设计。) – soulmerge 2009-09-13 15:03:26

+0

-1忽略具体问题.. as一个规则你不想使用正则表达式,但他明确表示,他想要替换的所有元素看起来完全一样,所以对于这种情况,正则表达式是一个更好的解决方案。 – amitkaz 2009-09-13 15:33:03

1

在您的正则表达式中添加全局替换标志“g”。

“/ your_regex /我

由于soulmerge建议,因为你的HTML不是畸形(我假定你的意思是格式良好的XML),XSLT转换是改变的有效途径你文档中的任何内容您可以匹配@src属性并根据您的要求对其进行修改。

如果您需要同时更改文档的其他部分,您还可以匹配任何其他标签/属性。