Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html regex忽略重复的匹配项_Html_Regex - Fatal编程技术网

Html regex忽略重复的匹配项

Html regex忽略重复的匹配项,html,regex,Html,Regex,我正在使用一个应用程序来搜索这个我现在无法控制的网站,我想知道是否有一种方法可以只使用正则表达式忽略重复匹配 现在我写这篇文章是为了在源代码页面中找到匹配的图像源 使用它来检索src <span> <img id="imgProduct.*? src="/(.*?)" alt=" 由此 <span> <img id="imgProduct_1" class="SmPrdImg selected" onclick="(some javascript

我正在使用一个应用程序来搜索这个我现在无法控制的网站,我想知道是否有一种方法可以只使用正则表达式忽略重复匹配

现在我写这篇文章是为了在源代码页面中找到匹配的图像源

使用它来检索src

<span> <img id="imgProduct.*? src="/(.*?)" alt="

由此

<span> <img id="imgProduct_1" class="SmPrdImg selected"     
onclick="(some javascript);" src="the_src_I_want1.jpg" alt="woohee"> </span>
<span> <img id="imgProduct_2" class="SmPrdImg selected"     
onclick="(some javascript);" src="the_src_I_want2.jpg" alt="woohee"> </span>
<span> <img id="imgProduct_3" class="SmPrdImg selected"     
onclick="(some javascript);" src="the_src_I_want3.jpg" alt="woohee"> </span>


唯一的问题是,上面列出的完全相同的代码在源代码中复制得更低。有没有办法只使用正则表达式忽略或删除重复项?

您的模式不是很好;它的方式太具体到您的确切的源代码,因为它目前存在。正如@Truth所评论的,如果这种情况改变,你将打破你的模式。我会推荐更像这样的东西:

<img[^>]*src=['"]([^'"]*)['"]
然后,您将获得每个
src
的最后一个实例的匹配

崩溃 为了进行说明,以下是该模式的工作原理:

<img[^>]*src=['"]([^'"]*)['"](?!(?:.|\s)*<img[^>]*src=['"]\1['"])
(?!
开始一个负前瞻:我们要求在此点之后不能匹配以下模式

然后
(?:.|\s)*
匹配任何字符或任何空格。这是因为JavaScript的
不会匹配换行符,而
\s
会匹配换行符。大多数情况下,我很懒,不想为任何可能的行尾编写模式,所以我只使用
\s
*
当然意味着我们可以有任意数量的换行符。这意味着在文件其余部分的任何地方都找不到以下内容(仍然是负前瞻的一部分)。将
(?:
替换为
)意味着不会记住此括号作为反向引用

该位是
。这与初始模式非常相似,但不是使用
([^']*)
捕获
src
,而是使用
\1
引用先前捕获的
src

因此,该模式表示“将
img
中没有任何
img
src
与文件其余部分中的相同
src
匹配”,这意味着您只获得每个
src
的最后一个实例,而没有重复的实例


如果你想删除任何
img
src
多次出现的所有实例,顺便说一句,我认为你运气不好。JavaScript不支持lookbehind,而且绝大多数这样做的正则表达式引擎无论如何都不允许如此复杂的lookbehind。我不会太努力让它们独一无二,只需在PHP中使用数组_unique进行preg匹配即可:

(?!
    (?:
        .
    |
        \s
    )*
    <img[^>]*src=['"]\1['"]
)
$pattern='~
如果您使用的是JavaScript,那么您需要使用另一个函数,而不是array_unique,请检查PHPJS:

欢迎使用Stack Overflow!请避免使用正则表达式解析HTML。请改用一个。@Truth:他实际上并不是在解析HTML,不过,他只是想要
src
属性。正则表达式可以处理这么多,因为不需要进行括号平衡。使用正则表达式解析HTML已经被广泛地讨论过了。我的共识是相关:@AbeMiessler:请参阅上面的re:Truth's评论。这和那不一样。我喜欢那一页,同意每一个字,但这个问题不一样。改用XPath,在不显式解析文档的情况下提取所需的节点集应该很容易。我必须对结构和您希望保留的确切节点来提供查询。这是一种比纯正则表达式解决方案更好的方法。我确实建议使用一种更健壮的初始匹配模式,例如
。此外,没有迹象表明他在这里实际使用PHP;我认为JavaScript就是正在发生的事情。不过,这是他想要的想法。Tota我同意,这个模式需要一些爱,但如果他匹配的数据是严格的,那么就没有必要做得更好,如果它匹配,那么它匹配-但你的权利,这不是一个模式,将在多个网站上持续工作。我想我可能有忍者编辑你:还有一个问题,我没有看到任何迹象表明他正在使用ng PHP。JavaScript是否有类似于
array\u unique
的功能?@dragoonwrith你说得对,它非常具体。我只需要在一个网站上运行它,这就是为什么我让它如此具体。再次感谢你的输入!我现在要试用你的正则表达式代码-谢谢大家的输入。唯一的问题是我不知道由于交接问题,我现在无法访问该网站,但我们需要尽快从中收集信息,因此我们使用基于浏览器的应用程序来搜索和收集使用正则表达式的信息。应该更具体一些。@williamvicary你的想法很好,但我不能只使用php正则表达式搜索哇,这是一个令人惊讶的答案!!如果我可以的话-投你的票我会的,但很遗憾我还是一个noob。另外,非常感谢你以你的方式解释,因为我对使用regex非常陌生。很遗憾,我将不得不使用前瞻性,因为我们还没有访问该网站:((移交问题)我必须使用正则表达式。我也忘了问这个问题,我的错,但从我对这段代码的理解来看,它只会在有重复代码的情况下放弃匹配,或者我误解了吗?@TravisDtfsuCrum:不,它匹配文档后面没有找到相同的
src
的所有情况,即最后一个。如果只有一个,那么“一是最后一个”。@TravisDtfsuCrum:另外,你可以向上投票;只需单击向上箭头。如果这对你有效,你也可以单击复选标记将其标记为已接受的答案。哦,是的,谢谢@Dragoonwrith!我还不能向上投票,因为我的声誉只有6,你必须至少有15个……你可以帮我向上投票我的问题:)
(?!
    (?:
        .
    |
        \s
    )*
    <img[^>]*src=['"]\1['"]
)
$pattern = '~<span> <img id="imgProduct.*? src="/(.*?)" alt="~is';
$match   = preg_match_all($pattern, $html, $matches);

if ($match)
{
     $matches = array_unique($matches[1]);
}