2013-02-13 36 views
1

我尝试做以下字符串preg_match_all所有结果加一:preg_match_all包括没有一定的值

$string1 = '/<a href="(.*?).(jpg|jpeg|png|gif|bmp|ico)"><img(.*?)class="(.*?)wp-image-(.*?)" title="(.*?)" (.*?) \/><\/a>/i'; 
preg_match_all($string, $content, $matches, PREG_SET_ORDER); 

以上工作正常,我在做什么,问题是我还需要检测没有“标题”标签的图像。

有没有办法做一个preg_match_all并添加匹配如果字符串没有价值[6]? (标题标志是值[6]),并给这些结果(无标题)一个特殊的名称(即$ matches_no_title?

我目前的解决方案是运行两个preg_match_all两个不同的字符串但是如果我可以在一个preg_match_all中完成所有操作以优化网站速度,那会更好!

+0

不完全是(title =“(。*?)”(。*?))? – 2013-02-13 14:11:05

+0

我想隔离标题信息,没有第二个(。*?)标题标志值变成标题内的任何内容+随后的所有内容。这不是分开标志的好方法吗? – user1945912 2013-02-13 14:13:12

回答

1

如果您确定title属性在class之后出现(右)属性,它很简单,只是使其可选

$string1 = '/<a href="(.*?)\.(jpg|jpeg|png|gif|bmp|ico)"><img(.*?)class="(.*?)wp-image-(.*?)"(?: title="(.*?)")? (.*?) \/><\/a>/i'; 

请注意,正则表达式是特定于垫通用HTML。

在这种情况下,您可能会更好地使用SimpleXMLXPath或库如PHP Simple HTML DOM Parser

1

我想用轮换空会做你想要什么:

$string1 = '/<a href="(.*?).(jpg|jpeg|png|gif|bmp|ico)"><img(.*?)class="(.*?)wp-image-(.*?)" (|title="(.*?)") (.*?) \/><\/a>/i'; 
preg_match_all($string1, $content, $matches, PREG_SET_ORDER); 

您可能还需要获得幻想有关可选的空白;因为它是,你会期望在可选title =“blah”标记之前和之后匹配一个空格,这意味着如果title =“blah”不存在,那么匹配会查找两个空格... so你可能想

wp-image-(.*?)"(| title="(.*?)")(.*?) \/> 

wp-image-(.*?)"(|\s+title="(.*?)"\s+)(.*?) \/> 

,而不是

wp-image-(.*?)" (|title="(.*?)") (.*?) \/> 
2

正则表达式是不是你想要什么,最好的办法。你可以尝试解析HTML并得到你想要的。

$dom = new domDocument; 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    echo $image->getAttribute('src'); 
}