繁体   English   中英

preg_match_all包含所有结果加上没有特定值的结果

[英]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。

在这种情况下,您最好将SimpleXMLXPath一起使用,或者使用像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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM