我经常是regex的新手,所以我创建的regex表达式有几个问题。
我想要下面表达式中粗体的部分捕获
src=">aifwoenflkwenflk">
我自己创建了以下表达式:
((?<=src=)|(?<=href=))"(.*?)((?=")|(?='))"
它有效,但有两个问题,
- 它只需要捕获引号的内部,但同时捕获两个引号(简单修复(
- 我需要它来支持单引号或双引号
我创建了一个新的表达式,它可以做我想做的事情:
((?<=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