[英]preg_match_all to include all results plus ones without a certain value
我正在尝试对以下字符串执行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(相同的字符串,除了一个没有title =“”部分),但如果我可以在一个preg_match_all中完成所有这些以优化网站速度,那就更好了!
正则表达式它不是你想要的最好的方法。 您可以尝试解析HTML并获得您想要的内容。
$dom = new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
echo $image->getAttribute('src');
}
如果您是确保title
属性来(右)后class
属性,这很简单。 只是让它可选。
$string1 = '/<a href="(.*?)\.(jpg|jpeg|png|gif|bmp|ico)"><img(.*?)class="(.*?)wp-image-(.*?)"(?: title="(.*?)")? (.*?) \/><\/a>/i';
请注意,正则表达式是特定的,以匹配一般HTML。
在这种情况下,您最好将SimpleXML与XPath一起使用,或者使用像PHP Simple HTML DOM Parser这样的库。
我认为用null替换会做你想要的:
$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”标记之前和之后匹配一个空格,这意味着如果标题=“blah”不在那里,匹配将寻找两个空格...所以你可能想要
wp-image-(.*?)"(| title="(.*?)" )(.*?) \/>
要么
wp-image-(.*?)"(|\s+title="(.*?)"\s+)(.*?) \/>
代替
wp-image-(.*?)" (|title="(.*?)") (.*?) \/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.