1

我正在尝试对以下字符串执行 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);

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

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

我目前的解决方案是在两个不同的字符串上运行两个 preg_match_all (相同的字符串,除了一个没有 title="" 部分),但如果我可以在一个 preg_match_all 中完成所有操作以优化网站速度,那就更好了!

4

3 回答 3

2

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

$dom = new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
    echo $image->getAttribute('src');
}
于 2013-02-13T14:30:27.930 回答
1

如果您确定该title属性(右)在该class属性之后,那很简单。只需将其设为可选。

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

请注意,正则表达式是专门匹配一般 HTML 的。

在这种情况下,您最好将SimpleXMLXPathPHP Simple HTML DOM Parser之类的库一起使用。

于 2013-02-13T14:13:05.500 回答
1

我认为与 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" 标记之前和之后匹配一个空格,这意味着如果 title="blah" 不存在,则匹配将查找两个空格......所以你可能想要

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

或者

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

代替

wp-image-(.*?)" (|title="(.*?)") (.*?) \/>
于 2013-02-13T14:22:34.917 回答