正则表达式内部使用OR进行非捕获

时间:2016-10-29 04:59:07

标签: php regex

我经常是regex的新手,所以我对我创建的正则表达式有几个问题。

我希望下面的表达式的粗体部分被捕获

SRC = “的 aifwoenflkwenflk

我有自己创建的以下表达式:

((?<=src=)|(?<=href=))"(.*?)((?=")|(?='))"

它有效,但有两个问题,

  1. 它只需捕获引号内部,但捕获两个引号(Easy fix)
  2. 我需要它来支持单引号或双引号
  3. 我创建了一个能够完全符合我想要的新表达式:

    ((?<=src=')|(?<=href=')|(?<=src=")|(?<=href="))(.*?)((?=")|(?='))
    

    虽然很长。必须有一些方法来优化它,以便它能够使用单引号或双引号,并且只捕获内部。有谁知道我怎么能做到这一点?

    我感谢所有人的帮助!

2 个答案:

答案 0 :(得分:1)

与往常一样,请考虑使用一个不错的DOM解析器,它也会轻轻地使用单引号:

<?php

$data = <<<DATA
<a href="some string here">some link here</a>
<img src="some so'urce here">
<a href="some other string here">some link here</a>
DATA;

$doc = new DOMDocument();
$doc->loadHTML($data, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$xpath = new DOMXPath($doc);

# links
foreach ($xpath->query("//a[@href]") as $item) {
    $source = $item->getAttribute('href');
    echo $source;
}

# images
foreach ($xpath->query("//img[@src]") as $item) {
    $source = $item->getAttribute('src');
    echo $source;
}
?>

答案 1 :(得分:0)

$regex = '/(?:src|href)=["\']?([^"\'>]+)["\']?/';

DEMO