Regex使用OR内部不捕获


Regex Noncapturing inside with OR

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

我想要下面表达式中粗体的部分捕获

src=">aifwoenflkwenflk">

我自己创建了以下表达式:

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

它有效,但有两个问题,

  1. 它只需要捕获引号的内部,但同时捕获两个引号(简单修复(
  2. 我需要它来支持单引号或双引号

我创建了一个新的表达式,它可以做我想做的事情:

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

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

我感谢所有的帮助!

一如既往,考虑使用一个不错的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;
}
?>
$regex = '/(?:src|href)=["'']?([^"''>]+)["'']?/';

DEMO