【问题标题】:preg_match_all multiple results on same line [duplicate]preg_match_all 同一行上的多个结果[重复]
【发布时间】:2014-04-21 22:00:10
【问题描述】:

我尝试从中提取数据的结果采用以下格式

<a href="anime/hackroots">.hack//Roots</a> <img src="images/video.png" border=0 width=16 height=16 alt="Flash video available" title="Flash video available"> (8) <br><a href="anime/hacksign">.hack//SIGN</a> 

我正在尝试使用以下代码提取每个动漫的位置和名称:

preg_match_all('#<a href="anime/(.*)">(.*?)</a>#', $content, $match);

但是,结果跨越多行,每行有 50 多个结果,我无法使用该方法获取单个匹配项,所以想知道我做错了什么。

任何帮助将不胜感激!

【问题讨论】:

  • 你做错的是使用正则表达式进行 HTML 解析。
  • 问了一千次,只是你写了正则表达式来这样做。了解"Greediness" in PCRE。还要注意点“.”匹配哪些字符(尤其是空格)。
  • #&lt;a href="anime/(.*)"&gt;(.*?)&lt;/a&gt;#s; s modifier.
  • 另外,将您的第一个 (.*) 更改为 (.*?) 以使其成为 lazy。或者使用更具体的字符类说“除了"”(([^"]*))。

标签: php regex preg-match-all


【解决方案1】:

使用惰性匹配器。集合匹配也应该有帮助

<?php

$string = '<a href="anime/hackroots">.hack//Roots</a> <img src="images/video.png" border=0 width=16 height=16 alt="Flash video available" title="Flash video available"> (8) <br><a href="anime/hacksign">.hack//SIGN</a>';

$pattern = '#<a href="anime/(?P<location>.*?)">(?P<description>.*?)</a>#';

$matches = null;
preg_match_all($pattern, $string, $matches, PREG_SET_ORDER);
print_r($matches);

https://eval.in/139332

【讨论】:

  • 非常感谢!这很好用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多